반응형

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 입니다.
반응형

+ 최근 글