我正在学习如何将Qt与PyQt一起使用,我有一个带有StandardItemModel的QTabelView我已成功填充模型并将itemChanged信号连接到一个插槽。我想乱搞IPython中返回的任何对象,所以目前我有这条线:
def itemChangedSlot(epw, item):
new_data = item.data()
print new_data
print item
打印
<PyQt4.QtGui.QStandardItem object at 0x07C5F930>
<PyQt4.QtCore.QVariant object at 0x07D331F0>
在IPython会话中是否可以使用此内存地址获取对象?我在Google上没有看到任何内容,也许我没有正确的术语?
答案 0 :(得分:8)
您需要持有对象的引用(即将其分配给变量或将其存储在列表中)。
从对象地址直接转到对象(即pointer dereferencing)没有语言支持。
答案 1 :(得分:8)
你几乎肯定会问错误的问题,而Raymond Hettinger的回答几乎肯定是你真正想要的。
这样的东西可能有助于深入了解CPython解释器的内部以用于学习目的或者为安全漏洞或其他东西进行审计......但即便如此,您最好将Python解释器嵌入到程序中并写入将您想要的任何内容暴露给Python解释器的函数,或者至少编写一个允许您操作CPython对象的C扩展模块。
但是,你真的需要这样做的机会......
首先,没有可靠的方法来从repr
获取地址。具有有用eval
能力表示的大多数对象将为您提供相应的功能。例如,('1', 1)
的repr为"('1', 1)"
,而不是<tuple at 0x10ed51908>
。此外,即使对于没有有用表示的对象,返回<TYPE at ADDR>
只是许多类型遵循的未声明约定(以及用户定义类的默认值),而不是您可以依赖的。
但是,由于你可能只关心CPython,你可以依靠id
:
CPython实现细节:这是内存中对象的地址。
(当然如果您有对象id
(或repr
),则不需要通过指针解除引用,如果您没有对象,则为可能是垃圾收集所以没有什么可以取消引用,但也许你还有它,只是不记得你把它放在哪里......)
接下来,你用这个地址做什么?好吧,Python没有公开任何与id
相反的函数。但Python C API已有详细记录 - 如果您的Python是围绕共享库构建的,则可以通过ctypes
访问该C API,只需将其加载即可。实际上,ctypes
提供了一个特殊变量,可以自动加载正确的共享库,以便在ctypes.pythonapi
上调用C API。
在ctypes
的非常旧版本中,您可能必须明确地查找并加载它,例如pydll = ctypes.cdll.LoadLibrary('/usr/lib/libpython2.5.so')
(这适用于安装在/ usr / lib中的Python 2.5的Linux;显然,如果有的话细节不同,确切的命令行会有所不同。)
当然,崩溃Python解释器要比做任何有用的东西要容易得多,但是做一些有用的事情并不是不可能的,你可以尝试使用它。