我有一个简单的函数,我想在两个单独的程序执行中调用。第一次运行程序时,它将函数指针保存到文件中:
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'时,它给我一些类似于:函数测试0x0351C170:
所以我想我的第一个问题是,为什么这会起作用,即使参考地址应该在运行时改变?
我的第二个问题是,如果它没有改变/或者它在某种程度上无关紧要,我怎样才能通过在0x0351C170处获得字符串::: test来执行该函数:例如类似的东西:
def test():
print 'test'
a = test
a() #outputs: 'test'
b = str(a) #<function test at 0x03509170>
eval(b)() #error
答案 0 :(得分:2)
可以腌制以下类型:
- 无,真,假
- 整数,长整数,浮点数,复数
- 普通和Unicode字符串
- 仅包含可选对象的元组,列表,集和词典
- 在模块顶层定义的功能
- 在模块顶层定义的内置函数
- 在模块顶层定义的类
- 可以选择
__dict__
或__setstate__()
的类的实例(有关详细信息,请参阅pickle协议一节)
因此pickle
模块实际上在pickle文件中写出了Python字节码。重新加载pickle文件时,将从代码对象重新创建该函数。
要回答问题的第二部分,不,只能通过了解内部地址值来直接调用Python代码。
答案 1 :(得分:2)
您无法在给定地址执行功能。
是,参考地址在运行时更改。当cPickle加载文件时,它会创建一个函数,你看到的就是那个函数。它与原始函数的地址不同。