2014-10-28 174 views
1
def funcA(x): 
    return x 

funcA.__code__.__hash__()合適的方法來檢查是否funcA已經改變?哈希Python函數

我知道funcA.__hash__()不會像id(funcA)/16一樣工作。我檢查過,__code__.__hash__()不適用。我也在ipython終端中測試了這個行爲,它似乎成立了。但是這保證了工作?

爲什麼

我想有一箇舊版本的功能比較,相同功能的新版本的方式。

我試圖創建一個基於磁盤的/長期高速緩存的裝飾。因此,我需要一種方法來確定功能是否發生了變化。我還需要查看調用圖來檢查被調用的函數是否已經改變,但這不是這個問題的一部分。

要求:

  • 需要是在多個電話和設備穩定。 1表示在Python 3.3中,每個新實例的開始都隨機分配了。雖然它也說「哈希隨機化被默認禁用」。理想情況下,即使啓用了隨機化,我也希望這個功能可以保持穩定。
  • 理想情況下,它將爲def funcA: passdef funcB: pass產生相同的散列值,即僅當函數的名稱發生變化時。可能沒有必要。
  • 我只在乎Python 3的

一個替代辦法是哈希包含給定函數的文件中的文本。

+1

也許像'pickle'會更有用嗎? – 2014-10-28 18:20:53

+0

鹹菜如何更有用?我應該醃製該功能嗎? – Unapiedra 2014-10-28 18:25:03

+0

「請注意,函數(內置的和用戶定義的)由」完全限定的「名稱引用而非值賦值,這意味着只有函數名稱被pickle,以及函數在其中定義的模塊的名稱。函數的代碼和它的任何函數屬性都沒有被醃製。「來自pickle上的Python文檔。 – Unapiedra 2014-10-29 07:47:14

回答

0
  1. 是的,看起來func_a.__code__.__hash__()是代碼的特定功能所特有的。我無法找到它在哪裏實施,或者在哪裏定義了__code__.__hash__()

  2. 完美的方法是使用func_a.__code__.co_code.__hash__(),因爲co_code的字節碼是一個字符串。請注意,在這種情況下,函數名稱不是散列的一部分,具有相同代碼但名稱爲func_afunc_b的兩個函數將具有相同的散列。

    hash(func_a.__code__.co_code) 
    

Source