将内存地址转换为函数对象

Converting a memory address to a function object

Maya 中的灯光有一个属性 Use Color Temperature,它是一个复选框,当我切换它时,会在 Maya 中调用一个函数来实际完成幕后工作。不幸的是,函数地址 <function callback at 0x0000000051CD7DD8> 被打印出来而不是它的名字。单击复选框时,我不知道执行了哪个功能。有什么方法可以将此地址转换为 python 函数对象,或者我可以使用此内存地址打印函数的实际名称吗?

这意味着调用了一个名为 callback 的函数。

我会在相应的代码文件中查找 def callback(...): 并查看它的作用。

要重新生成您的输出,只需要一个名为 callback:

的函数
>>> def callback():
...     print "My name is Reut Sharabani"
... 
>>> cb = callback
>>> cb
<function callback at 0x7f182f3ca6e0>

如果您想以编程方式获取函数的名称:

>>> cb.__name__
'callback'

如果您想了解更多信息,您甚至可以使用 dis and it's code object:

对其进行反汇编
>>> import dis
>>> dis.dis(cb.__code__)
  2           0 LOAD_CONST               1 ('My name is Reut Sharabani')
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE      

这似乎是纯粹的邪恶,老实说,我认为您 can/should 改用 callback。但作为参考,显然您可以使用垃圾收集模块 gcid.

中获取对象

在这个 SO response 上找到(你真的可以在 SO 上找到任何东西......):

import gc

def objects_by_id(id_):
    for obj in gc.get_objects():
        if id(obj) == id_:
            return obj
    raise Exception("No found")

我认为您需要将该数字强制转换为 int 表示,因为 id(obj) returns 是 int 而不是 hex

注意这可能有一些奇怪的竞争条件,对象 ID 可能在对象被删除后被回收。