Software Workshop

Python에서 함수의 호출 관계를 파악하려면 sys 패키지의 _getframe() 함수를 이용하여 콜 스택을 확인하는 방법이 있다.

#!/usr/bin/env python

import sys

def funcname():
    return sys._getframe(1).f_code.co_name + "()"

def callername():
    return sys._getframe(2).f_code.co_name + "()"

def test():
    print(funcname())
    print(callername())

def main():
    test()

if __name__ == "__main__":
	  main()

출력

test()
main()

또 다른 방법으로 inspect 패키지의 stack() 함수를 이용해서 콜 스택을 확인하는 방법이 있다.

import inspect

def funcname():
    return inspect.stack()[1][3] + "()"

def callername():
    return inspect.stack()[2][3] + "()"

def test():
    print(funcname())
    print(callername())

def main():
    test()
    
if __name__ == "__main__":
    main()

이 두 가지 방법의 공통점은 함수 call stack의 상대적인 위치로 두번째, 세번째 프레임을 사용한다는 것이다. 두번째를 가리키는 인덱스 1, 세번째를 가리키는 인덱스 2가 사용된 것에 주의할 것

[main() 2] -> [test() 1]
[test() 1] -> [funcname() 0]
[main() 2] -> [test() 1]
[test() 1] -> [callername() 0]