用指针地址调用python中的函数

时间:2011-12-28 04:40:25

标签: python

我有一个简单的函数,我想在两个单独的程序执行中调用。第一次运行程序时,它将函数指针保存到文件中:

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

2 个答案:

答案 0 :(得分:2)

请参阅pickle documentation

  

可以腌制以下类型:

     
      
  • 无,真,假
  •   
  • 整数,长整数,浮点数,复数
  •   
  • 普通和Unicode字符串
  •   
  • 仅包含可选对象的元组,列表,集和词典
  •   
  • 在模块顶层定义的功能
  •   
  • 在模块顶层定义的内置函数
  •   
  • 在模块顶层定义的类
  •   
  • 可以选择__dict____setstate__()的类的实例(有关详细信息,请参阅pickle协议一节)
  •   

因此pickle模块实际上在pickle文件中写出了Python字节码。重新加载pickle文件时,将从代码对象重新创建该函数。

要回答问题的第二部分,不,只能通过了解内部地址值来直接调用Python代码。

答案 1 :(得分:2)

您无法在给定地址执行功能。

是,参考地址在运行时更改。当cPickle加载文件时,它会创建一个函数,你看到的就是那个函数。它与原始函数的地址不同。