sys._getframe(x).f_code.co_name 메서드는 현재 사용하는 함수 기준으로 x번째 계층의 함수명을 가져오는 함수이다.
아래 예로 간단히 의미를 알 수 있다.
import sys
def main_function():
sub_function()
def sub_function():
print(sys._getframe(0).f_code.co_name)
print(sys._getframe(1).f_code.co_name)
여기서 main_function을 실행하면 아래와 같은 결과가 출력된다.
sub_function
main_function
main_function은 sub_function을 하위함수로 갖고 있기 때문에, sub_function 기준으로 0번째 계층은 sub_function 자체이고 1번째 계층은 main_function이기 때문에
sys._getframe(0).f_code.co_name → sub_function
sys._getframe(1).f_code.co_name → main_function
그럼 이런 함수는 어떨때 사용할까?
함수에서 다른 함수를 호출 할 때 호출한 함수의 이름을 가져올 필요가 있을때가 있다.
(현재 실행중인 함수의 이름이 필요할 때가 있다.)
예를 들어 아래와 같이 함수를 작성한다고 해보자
sum_cal 함수 : 두 수의 합을 출력
sub_cal 함수 : 두 수의 차를 출력
min_cal 함수 : 두 수 중 작은 값을 출력
max_cal 함수 : 두 수 중 큰 값을 출력
출력 형식 "두 수 a와 b의 '함수명' 결과는 resurt 입니다."
그러면 보통 아래와 같이 함수마다 print 함수를 사용해서 출력해야한다.
def sum_cal(a,b):
result = a+b
print(f'두 수{a}와 {b}의 sum_cal 결과는 {result} 입니다.')
def sub_cal(a,b):
result = a-b
print(f'두 수{a}와 {b}의 sub_cal 결과는 {result} 입니다.')
def min_cal(a,b):
result = min(a,b)
print(f'두 수{a}와 {b}의 min_cal 결과는 {result} 입니다.')
def max_cal(a,b):
result = max(a,b)
print(f'두 수{a}와 {b}의 max_cal 결과는 {result} 입니다.')
3, 5 로 실행시 아래와 같이 결과가 나온다.
두 수3와 5의 sum_cal 결과는 8 입니다.
두 수3와 5의 sub_cal 결과는 -2 입니다.
두 수3와 5의 min_cal 결과는 3 입니다.
두 수3와 5의 max_cal 결과는 5 입니다.
이제 sys._getframe()를 사용해서 함수명을 인수로 가져올 수 있도록 하여 결과를 출력하는 함수를 따로 만든다면
아래와같이 코드를 간단하게 만들 수 있다.
import sys
def sum_cal(a,b): print_result(a,b,a+b)
def sub_cal(a,b): print_result(a,b,a-b)
def min_cal(a,b): print_result(a,b,min(a,b))
def max_cal(a,b): print_result(a,b,min(a,b))
def print_result(a,b,result):
name = sys._getframe(1).f_code.co_name
print(f'두 수{a}와 {b}의 {name} 결과는 {result} 입니다.')
3, 5로 실행한 결과는 아래와 같이 동일하다. name = sys._getframe(1).f_code.co_name 을 통해 하위 계층 함수명을 변수로 가져왔기 때문이다.
두 수3와 5의 sum_cal 결과는 8 입니다.
두 수3와 5의 sub_cal 결과는 -2 입니다.
두 수3와 5의 min_cal 결과는 3 입니다.
두 수3와 5의 max_cal 결과는 3 입니다.
'파이썬 잡지식' 카테고리의 다른 글
05. for 문에 변수를 할당하지 않고 단순 반복용으로 사용하고 싶을때. 언더바 '_' (for _ in ... )사용법 (0) | 2021.09.30 |
---|---|
04. 문자열 공백제거 strip함수 (+replace 함수) (0) | 2021.09.30 |
03. print 함수 사용 시 출력값 사이에 원하는 문자 넣는 인수 sep (0) | 2021.09.30 |
02. print 함수 사용시 줄바꿈 없애기 end 인수 (0) | 2021.09.30 |