python - 如何从存储槽中获取功能
问题描述
只是出于对 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 工作原理感兴趣的问题,而不是我不知道如何调用函数来说明这一点。
解决方案
这是特定于 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()
但没有走得太远。
推荐阅读
- ios - VolumeView 未显示 Airplay 按钮
- phpunit - 使用 phpunit 自我更新 *.phpt 测试?
- node.js - 安装依赖项会导致 npm ERR!无法读取未定义的属性“解决”
- python - 为什么我使用 .isdigit() 函数时会返回错误?
- javascript - 键盘未检测到输入
- python - 在测试函数python中有一个if语句
- html - 基于 HTML 内容构建 PDF 页面以适应 A4 大小
- wordpress - 如何为 flatpickr/Ninja Forms 设置 minDate?
- c++ - 链接器命令失败 - OSX 上的 C++
- jupyter-notebook - Jupyternotebook 显示问题