当前位置: 首页 > 面试题库 >

获取代码对象的Python函数

金飞翼
2023-03-14
问题内容

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

sys.settraceframe具有一个f_code代码对象。

对于作为函数的跟踪程序的那些调用,如何获得函数对象(及其__annotation__成员)?

到目前为止,通过反复试验,我有:

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

这似乎适用于函数,但不适用于类成员函数。更糟糕的是,它将类成员函数与同名的顶级函数混淆。

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


问题答案:

通过inspect.getframeinfo模块。我的意思是-在Python中没有做到这一点的直接方法-
多数情况下,您可以在没有功能的情况下掌握代码对象,而这只是通过帧自省。

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



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 探索和反编译python字节码[关闭] (6个答案) 7年前关闭。 假设我们有一个python字符串(不是文件,字符串,没有文件) 好?现在我们将字符串编译成一段python字节码 现在的问题是:假设我不知道TheString(代表原始字符串对象的字符串),我怎么能从Binary获得? 很快:与compile()相反的函数是什么? 问题答案: 没有源代码

  • 本文向大家介绍Python通过getattr函数获取对象的属性值,包括了Python通过getattr函数获取对象的属性值的使用技巧和注意事项,需要的朋友参考一下 英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If th

  • 本文向大家介绍JavaScript 获取函数对象的名称,包括了JavaScript 获取函数对象的名称的使用技巧和注意事项,需要的朋友参考一下 示例 6 ES6: 关于MDN的说明。自2015年起,可以在nodejs和除IE之外的所有主要浏览器中使用。 5 ES5: 如果您有对该功能的引用,则可以执行以下操作:

  • 问题内容: 我可以通过编程获得名称的功能代码吗? 喜欢: 可能吗? 是否有任何PHP自描述函数来重构函数/类代码? (意味着不要从源文件中正确获取源代码) 在Java中存在:http : //java.sun.com/developer/technicalArticles/ALT/Reflection/ 在PHP: get_class_method(0函数) 的typeof ReflectionF

  • 问题内容: 假设我有如下定义的Python函数: 我可以使用获取函数的名称。如上所述,我如何以编程方式获取其源代码? 问题答案: 如果该功能来自文件系统上可用的源文件,则可能会有帮助: 如果foo定义为: 然后: 返回值: 但是我相信,如果函数是从字符串,流中编译的,或者是从编译文件中导入的,那么您将无法检索其源代码。

  • 本文向大家介绍java 获取对象中为null的字段实例代码,包括了java 获取对象中为null的字段实例代码的使用技巧和注意事项,需要的朋友参考一下 下面一段简单的代码给大家分享java 获取对象中为null的字段,具体代码如下所述: PS:将Java对象中属性值为null获取到 话不多说,直接贴代码,这里可以进行对json对象参数进行校验的,找到不为空的参数,或者对象所有属性都不为空这样的校验

  • 函数名称:获取图片对象的宽高 函数功能: 获取图片对象的宽度和高度 函数方法 w,h = image.size(img) 参数 类型 必填 说明 img userdata 是 图片对象 返回值 类型 说明 w number 图片对象的宽度 h number 图片对象的高度 函数用例 --全屏截图 img = image.snapshot() if type(img) == "userdata" t

  • 我们采用GitLab作为项目代码释放平台,所有仓库源码及更新获取都需通过GitLab同步。 gitlab代码入口为:https://gitlab.com/nationalchip/vsp_sdk 一、注册GitLab账号 GitLab登录链接 GitLab账号注册可能需要翻墙,所以不能打开注册链接的,我们建议通过GitHab账号登录。 GitHub注册链接 没有GitHub账号的话,先通过下面链接