我有一个简单的函数,我想在两个独立的程序执行中调用它。我第一次运行这个程序时,它将函数指针保存到一个文件中:
import cPickle
def test():
pass
def main():
a = test
pFile = open('test.txt', 'wb')
cPickle.dump(a, pFile)
pFile.close()
第二次我想加载文件并执行保存在对象中的函数:
import cPickle
def test():
pass
def main():
pFile = open('test.txt', 'rb')
a = cPickle.load(pFile)
pFile.close()
a()
请注意,在cPickle中,这是可行的,这有点奇怪,因为我认为这基本上是指向函数的指针,并且在运行时会发生变化?当我打印'a‘时,它给我类似于:function test at 0x0351C170:。
所以我想我的第一个问题是,即使引用地址在运行时应该改变,为什么这种方法仍然有效?
我的第二个问题是,如果它没有改变/或者它以某种方式不相关,我如何仅通过在0x0351C170:处具有string::function test来执行函数。例如,像这样:
def test():
print 'test'
a = test
a() #outputs: 'test'
b = str(a) #<function test at 0x03509170>
eval(b)() #error
发布于 2011-12-28 04:45:22
可以对以下类型进行酸洗:
Unicode、True和False
__dict__
或__setstate__()
是可挑取的(有关详细信息,请参见pickle协议一节)因此,pickle
模块实际上在pickle文件中写出了Python字节码。重新加载pickle文件时,将从代码对象重新创建该函数。
要回答你的问题的第二部分,不,仅仅通过知道内部地址值是不可能直接调用Python代码的。
发布于 2011-12-28 04:46:50
您不能在给定的地址上执行函数。
是的,引用地址在运行时更改。当cPickle加载文件时,它会创建一个函数,您看到的就是该函数。它将不具有与原始函数相同的地址。
https://stackoverflow.com/questions/8651928
复制相似问题