首页 > 解决方案 > 如何从存储槽中获取功能

问题描述

只是出于对 Python 的兴趣而提出的问题。如何从它的存储槽中获取功能?这里我有一个例子:

>>> def func():
    pass

>>> func
<function func at 0x00000280B1883288>

那么0x00000280B1883288它是存储在 RAM 内存中的位置,对吗?但如果我这样做:

>>> eval('0x00000280B1883288')
2751757562504
>>> func
<function func at 0x00000280B1883288>
>>> 0x00000280B1883288
2751757562504

我只得到一个 int 返回,如果我尝试调用它,我会得到一个 int 不可调用的错误。但是是否有可能在不调用 func 的情况下从它的 ram 插槽中获取一个函数?

这是一个对 Python 工作原理感兴趣的问题,而不是我不知道如何调用函数来说明这一点。

标签: pythonpython-3.xfunctionram

解决方案


这是特定于 CPython 的,但可以_ctypes用于此:

import _ctypes

def di(obj_id):
    """ Inverse of id() function. """
    return _ctypes.PyObj_FromPtr(obj_id)

def func():
    return 42

func_id = id(func)
print(func)
print(hex(func_id))
print(di(func_id)())

这改编自Is it possible to dereference variable id's?

PS我也简单地尝试过,_ctypes.call_function()但没有走得太远。


推荐阅读