获取代码对象的Python函数

一个Python函数有一个代码对象 __code__.

A sys.settrace 踪迹 frame 拥有 f_code 代码对象。

对于那些对跟踪器的函数调用,我怎样才能获得函数对象(以及它的 __annotation__ 成员)?)

到目前为止,通过试验和错误,我做到了。

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

这似乎对函数有效,但对类成员函数无效;更糟糕的是,它混淆了类成员函数和同名的顶层函数。

(我使用的是 Python 3.2.3 (Xubuntu)。 我看到Python 3.3的 inspect 模块有一个 signature 函数;这将返回代码对象的注解,还是也需要一个函数对象?)

解决方案:

通过 inspect.getframeinfo 模块.我的意思是–在Python中没有直接的方法–大多数情况下,你可以在没有函数的情况下,通过frame instrospection来获取代码对象。

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

–这是Python 3的,对于Python 2,我们应该替换为 __code__func_code

给TA打赏
共{{data.count}}人
人已打赏
未分类

将Google Analytics添加到不同环境的Angular 5项目中。

2022-9-8 23:06:38

未分类

从TreeView拖动事件时,整个页面向右滚动(scheduleexternal-drag-drop)。

2022-9-8 23:06:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索