2011-12-28 61 views
2

我有一個簡單的函數,我想在兩個單獨的程序執行中調用。我第一次運行該程序可以節省函數指針到一個文件:使用指針地址在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處使用字符串:: function test。例如是這樣的:

def test(): 
    print 'test' 

a = test 
a()   #outputs: 'test' 

b = str(a) #<function test at 0x03509170> 
eval(b)() #error 

回答

2

pickle documentation

以下類型可以醃製:

  • 沒有,真,假
  • 整數,長整數,浮點數,複數
  • 正常和Unicode字符串
  • 元組,列表,集,並且只包含picklable對象
  • 功能字典在模塊的頂部級別定義
  • 內置在模塊的頂部水平
  • 類中定義的定義的函數在模塊的頂部電平這樣的類,其__dict____setstate__()是picklable的
  • 實例(見部分的詳細說明pickle協議)

因此pickle模塊實際上將Python字節碼寫入pickle文件。當pickle文件重新加載時,函數將從代碼對象中重新創建。

要回答你的問題的第二部分,不,只有瞭解內部地址值才能直接調用Python代碼。

+0

謝謝!這是很好的解釋 – Muppet 2011-12-28 04:58:39

2

您不能在給定的地址執行一個函數。

是的,引用地址在運行時發生變化。當cPickle加載文件時,它會創建一個函數,您看到的是該函數。它將不具有與原始功能相同的地址。

+0

嗯,這是一個恥辱。雖然謝謝! – Muppet 2011-12-28 04:57:09