'콜스택'에 해당되는 글 1건

  1. python/콜 스택 접근하기 2009/02/02

python/콜 스택 접근하기

Posted at 2009/02/02 15:35// Posted in python
스크립트 프로그래밍을 하다보면 간혹 콜러를 알기 위해 콜스택에 접근해야할 경우가 있습니다.


import sys
def func():
print sys._getframe().f_code.co_name

func()

python 에서는 위와 같이 콜스택의 현재 프레임에 접근해서 함수 이름을 얻어낼 수 있습니다.

콜러 함수 이름을 얻기 위해서는 sys._getframe().f_back 을 사용하거나


import sys
def func():
print sys._getframe().f_back.f_code.co_name

def func2():
func()

func2()



sys._getframe(1) 을 사용할 수 있습니다.


import sys
def func():
print sys._getframe(1).f_code.co_name

def func2():
func()

func2()


sys._getframe(n) 의 경우는 이미 눈치채셨겠지만
몇단계 전의 프레임을 얻어낼 때 사용합니다.


frame.f_code.co_name 는 무조건 함수 이름만을 얻어내기 때문에
클래스 인스턴스의 메소드 이름을 얻어내야 할 경우
메소드의 함수 이름은 알 수 있지만
어떤 클래스의 메소드인지는 알지 못합니다.

import sys

class Test:
def func(self):
print sys._getframe().f_back.f_code.co_name

def func2(self):
self.func()

t = Test()
t.func2()


결과
func2

파이썬 메소드 명칭을 정확히 얻어내기 위해서는
파이썬 메소드 호출 규약을 사용합니다.

파이썬에서는 0번째 인자로 self 를 넘겨주므로,
첫번째 인자로 어떤 클래스인지 알 수 있습니다.


frame = sys._getframe(n)
frameCode = frame.f_code
if frameCode.co_varnames:
firstVar = frame.f_locals.get(frameCode.co_varnames[0], None)
if firstVar:
firstVarClass = firstVar.__class__


해당 클래스내 frameCode.co_name 을 가진 메소드가 있는지 체크하고
만약 존재한다면 메소드가 가진 코드와 프레임 코드와 동일한가 체크하면
메소드 이름을 정확히 알아낼 수 있게 됩니다.


firstVarMethod = getattr(firstVarClass, frameCode.co_name)
if type(firstVarClass) is classobj:
if firstVarMethod and firstVarMethod.im_func.func_code== frameCode:
methodName = ".".join((str(firstVarClass), frameCode.co_name))



파이썬 콜스택 접근 기능을 이용하면 직접 로그 함수를 만들어 볼 수 있습니다.

more..


헉헉-_-
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/02/02 15:35 2009/02/02 15:35