2012-10-08 3 views
11

파이썬 함수의 코드 객체는 __code__입니다.코드 객체에 대한 파이썬 함수 얻기

sys.settrace 추적 frame에는 f_code 코드 개체가 있습니다.

함수 인 추적 프로그램에 대한 호출의 경우 함수 개체 (및 해당 __annotation__ 멤버)를 어떻게 얻을 수 있습니까?

지금까지 시행 착오, 내가 가진 :

if hasattr(frame.f_globals.get(frame.f_code.co_name),"__annotations__"): 

이 아닌 클래스 멤버 함수, 기능 작동하는 것 같다; 클래스 멤버 함수가 같은 이름의 최상위 함수와 혼동됩니다.

(. 파이썬 3.2.3 (분투)에 파이썬 3.3 inspect 모듈은 signature 기능을 가지고 있음을 볼 수있어,이 코드 개체에 대한 주석을 반환하거나 너무 함수 객체를 필요합니까?)

답변

5

inspect.getframeinfo 모듈을 통해. 제 말은 - 파이썬에서 그렇게하는 간단한 방법이 없다는 것입니다 - 대부분의 경우 코드 객체를 잡을 수 있습니다. 이미 함수가 없어도 프레임 인트로 스펙 션을 통과해야합니다.

Inspect의 getframeinfo 함수가 실행중인 프레임에 대한 정보를 반환하면 함수 객체의 이름을 가져 와서 함수 객체를 검색 할 수 있습니다.

힘든이 구현에 의존하고 몇 가지 단점이 있습니다 의존

>>> import inspect 
>>> def a(): 
... return inspect.currentframe() 
... 

>>> inspect.getframeinfo(a()) 
Traceback(filename='<stdin>', lineno=2, function='a', code_context=None, index=None) 
>>> b = inspect.getframeinfo(a()) 
>>> b.function 
'a' 

또 다른 방법,하지만 여전히 구현은 코드 개체 상기 추천인을 얻기 위해 GC 모듈 (가비지 수집기)를 사용하는 것입니다.

>>> import gc 
>>> from types import FunctionType 
>>> def a(): pass 
... 
>>> code = a.__code__ 

>>> [obj for obj in gc.get_referrers(code) if isinstance(obj, FunctionType) ][0] 
<function a at 0x7f1ef4484500> 
>>> 

-func_code

+0

은'inspect.getframeinfo' 튜플의'function' 필드에 의해 __code__를 교체해야 파이썬이 하나의 캐릭터가 아닌 함수 객체 것 같다 - 이 파이썬 3입니다. 그리고 gc 접근 방식은 여러 참조자를 위험에 빠뜨릴 수 있습니까? – Will

+0

gc.get_referrers (...)를 사용하여 끝났습니다. [0] – Will

+1

func_code/__ code__이 목록 이해에 필요한 코드 개체인지 확인하기 위해 추가 할 수 있습니다. 여러 함수를 생성하면 여전히 실패합니다. 동일한 코드 객체 (예 : 장식 자와. 나는 각각에 대해 func_closure의 f_locals를 func_closure와 비교할 수 있다고 가정한다 ... –

관련 문제