2012-03-20 67 views
0

我想緩存一個python方法的輸出,所以對於緩存鍵我使用散列(方法)+序列化的參數。我爲多個工作機器使用單個memcached服務器。Python獨特的方法標識符

問題是,散列(方法)已被證明在這些工作機器和進程中不一致。

class Foo(object): 
    def bar(): 
     pass 

x = Foo() 
hash(x.bar) #was inconsistent across machines/processes 

id()將無法工作,因爲這是一個內存位置,因此只能在一臺機器上工作。

謝謝!

+0

@delnan:哦,我們哈希函數... Nvm – 2012-03-20 20:38:31

+0

@NiklasB。你有什麼建議我採取的MD5哈希?該函數採用字符串輸入... – djs22 2012-03-20 20:40:26

+0

djs22:參數和某種完全限定的函數名稱。這已經是一個已解決的問題,但請查看第二個答案中提供的鏈接。 – 2012-03-20 20:42:26

回答

1
+0

謝謝dgorissen!我最終使用1stvamp的github中的代碼作爲編寫正確實現的完全限定函數名稱的基礎。 – djs22 2012-03-21 00:20:57

1

我會使用函數的名稱來代替,如x.foo.__name__

+0

是的,但在不同的類/模塊中具有相同名稱的函數呢? – djs22 2012-03-20 20:39:23

+0

@ djs22:在這種情況下,顯然你也應該包含模塊/類名。 – 2012-03-20 20:41:14

+0

如果你要根據他們的名字對它們進行哈希處理,那麼不要給函數同名? – kindall 2012-03-20 20:41:14

1

設置一個名稱延伸功能,將採取類名和方法名來創建一個字符串,然後取散了串。例如,讓x爲方法然後

def method_hash(x): 
    return hash("{0}.{1}".format(x.__objclass__.__name__, x.__name__)) 

這假定該方法是從類而不是一個特定的對象。如果來自對象,則可以使用x.__self__.__name__

+0

函數的'__class__'是'',至少在3.x中(它*可能*在2.x中以其「未綁定的方法」工作,但我不打賭)。 – delnan 2012-03-20 20:49:11

+0

@delnan謝謝你在'__class__'上發現我的錯誤,我編輯了我的答案來處理它。 – 2012-03-20 21:26:48

+0

一個很好的答案,但由於在原始問題中沒有指定原因(我需要在裝飾器中生成這個唯一標識符),所以並不總是很容易判斷您是在類/對象/還是在模塊中。 – djs22 2012-03-21 00:24:30