Obtención de la función Python para un objeto de código

Una función de Python tiene un objeto de código __code__ .

Un frame rastreo sys.settrace tiene un objeto de código f_code .

Para aquellas llamadas al trazador que son funciones, ¿cómo puedo obtener el objeto de función (y su miembro __annotation__ )?

Hasta ahora, por prueba y error, tengo:

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

Esto parece funcionar para funciones, pero no para funciones miembro de clase; peor aún, confunde las funciones de los miembros de la clase con las funciones de nivel superior del mismo nombre.

(Estoy en Python 3.2.3 (Xubuntu). Veo que el módulo de inspect Python 3.3 tiene una función de signature . ¿Devolverá esto la anotación de un objeto de código o también necesita un objeto de función?)

A través del módulo inspect.getframeinfo . Quiero decir, no hay una forma sencilla de hacerlo en Python. La mayoría de las veces, puede obtener el objeto de código, sin tener ya la función, es a través de la inestabilidad de cuadros.

La función getframeinfo de Inspect devuelve cierta información sobre el marco que se está ejecutando, luego puede recuperar el objeto de la función obteniendo su nombre.

Duro que esto depende de la implementación y tiene algunos inconvenientes:

 >>> import inspect >>> def a(): ... return inspect.currentframe() ... >>> inspect.getframeinfo(a()) Traceback(filename='', lineno=2, function='a', code_context=None, index=None) >>> b = inspect.getframeinfo(a()) >>> b.function 'a' 

Otra forma, pero aún dependiente de la implementación, es usar el módulo gc (recolector de basura) para obtener referencias a dicho objeto de código.

 >>> 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]  >>> 

– Esto es para Python 3 – para Python 2 uno debe reemplazar __code__ por func_code