현재 클래스 이름, 메소드 이름, 라인 넘버 얻기
- Development/Python
- 2009. 4. 7.
현재 실행하는 클래스의 이름과 메소드 이름, 라인 넘버를 얻어보자.
클래스의 인스턴스에서 호출한다는 가정하에,
그러나, 호출하는 클래스가 특정 클래스를 상속한 경우,
부모에 정의된 함수를 자식 클래스에서 그대로 사용하면서 trace()를 호출하였다면,
부모에 정의된 메소드를 실행하고 있더라도, 자식 클래스의 이름을
현재 클래스의 이름으로 리턴한다.
즉, A에 a()가 정의되어 있고, b = B(A)이나, b.a()를 실행도중 trace()를 호출하면,
현재 클래스의 이름이 A로 출력되는 대신 B로 출력된다.
클래스의 인스턴스에서 호출한다는 가정하에,
def trace(obj, toList = False):
import sys
className = obj.__class__.__name__
methodName = callersname()
lineNumber = sys.exc_info()[2].tb_lineno
if toList:
return className, methodName, lineNumber
else:
return "%s.%s[%d]" % (className, methodName, lineNumber)
단, callersname()은
def callersname():
return sys._getframe(2).f_code.co_name
import sys
className = obj.__class__.__name__
methodName = callersname()
lineNumber = sys.exc_info()[2].tb_lineno
if toList:
return className, methodName, lineNumber
else:
return "%s.%s[%d]" % (className, methodName, lineNumber)
단, callersname()은
def callersname():
return sys._getframe(2).f_code.co_name
그러나, 호출하는 클래스가 특정 클래스를 상속한 경우,
부모에 정의된 함수를 자식 클래스에서 그대로 사용하면서 trace()를 호출하였다면,
부모에 정의된 메소드를 실행하고 있더라도, 자식 클래스의 이름을
현재 클래스의 이름으로 리턴한다.
즉, A에 a()가 정의되어 있고, b = B(A)이나, b.a()를 실행도중 trace()를 호출하면,
현재 클래스의 이름이 A로 출력되는 대신 B로 출력된다.
'Development > Python' 카테고리의 다른 글
여러 버전의 python을 관리하는 또 다른 방법 : pyenv (0) | 2020.11.13 |
---|---|
virtualenvwrapper를 사용한 python3 virtualenv 설정 (0) | 2020.11.13 |
OSX) virtualenvwrapper로 virtualenv 편하게 쓰기 (0) | 2020.11.12 |
calInThread vs callFromThread (0) | 2009.04.27 |
현재 함수의 이름 얻기 (0) | 2009.04.07 |
How to catch 'ExpatError exception' (handling) (0) | 2009.04.07 |
queue의 push/pop 속도 비교 (0) | 2009.03.30 |
python class의 메소드별 단위 테스트 (unittest pyUnit vs py.test) (1) | 2009.02.12 |