[파이썬] 현재 함수 이름과 호출한 함수 이름 확인 하기

파이썬 현재 함수 이름과 호출한 함수 이름 확인하는 방법

sys 패키지를 사용하는 방법과, inspect 패키지를 사용하는 방법으로 각각 현재 함수의 이름과, 호출한 함수 이름을 확인하는 방법을 소개합니다.

sys 패키지를 활용한 확인 방법

import sys

# 현재 함수명 확인하기
sys._getframe(1).f_code.co_name

# 호출한 함수명 확인하기
sys._getframe(2).f_code.co_name

inspect 패키지를 활용한 확인 방법

import inspect

# 현재 함수명 확인하기
inspect.stack()[1][3]

# 호출한 함수명 확인하기
inspect.stack()[2][3]

결과 비교

아래와 같이 비교 코드를 작성하고 실행해 봅니다.

import sys
import inspect

class CallerTest:
    def whoami1(self):
        return sys._getframe(1).f_code.co_name

    def callername1(self):
        return sys._getframe(2).f_code.co_name

    def foo1(self):
        print("me:%s, caller:%s" % (self.whoami1(), self.callername1()))
        self.bar1()

    def bar1(self):
        print("me:%s, caller:%s" % (self.whoami1(), self.callername1()))

    def whoami2(self):
        return inspect.stack()[1][3]

    def callername2(self):
        return inspect.stack()[2][3]

    def foo2(self):
        print("me:%s, caller:%s" % (self.whoami2(), self.callername2()))
        self.bar2()

    def bar2(self):
        print("me:%s, caller:%s" % (self.whoami2(), self.callername2()))


if __name__ == '__main__':
    obj = CallerTest()

    obj.foo1()
    obj.bar1()

    obj.foo2()
    obj.bar2()

즉, 1의 방식과 2의 방식의 결과를 비교해 보면 아래와 같습니다.

me:foo1, caller:<module>
me:bar1, caller:foo1
me:bar1, caller:<module>

me:foo2, caller:<module>
me:bar2, caller:foo2
me:bar2, caller:<module>

보다시피 동일한 결과가 리턴됩니다.


Leave a Reply