我一直在嘗試醃製一個包含對靜態類方法引用的對象。 泡菜失敗(例如在module.MyClass.foo
),說明它不能被醃製,因爲module.foo
不存在。
我想出了以下解決方案,使用包裝對象定位在調用的功能,保存容器類和函數名稱:在Python中醃製靜態方法
class PicklableStaticMethod(object):
"""Picklable version of a static method.
Typical usage:
class MyClass:
@staticmethod
def doit():
print "done"
# This cannot be pickled:
non_picklable = MyClass.doit
# This can be pickled:
picklable = PicklableStaticMethod(MyClass.doit, MyClass)
"""
def __init__(self, func, parent_class):
self.func_name = func.func_name
self.parent_class = parent_class
def __call__(self, *args, **kwargs):
func = getattr(self.parent_class, self.func_name)
return func(*args, **kwargs)
我很納悶,雖然,有沒有更好的 - 更標準的方法 - 醃這樣的物體? 我不想做出改變全球pickle
過程(使用copy_reg
爲例),但下面的模式將是巨大的: MyClass類(對象): @picklable_staticmethod 高清富():「做」 打印
我在這方面的嘗試不成功,具體是因爲我無法從foo
函數中提取所有者類。我甚至願意爲明確的規範而定居(如@picklable_staticmethod(MyClass)
),但我不知道有什麼方法可以將MyClass
課程定義在正確的地方。
任何想法都會很棒!
Yonatan
這不會工作if原來的課程是不可用的,這(我認爲)擊敗了酸洗和取消靜態方法的目的 - 你允許它被醃製,但你需要整個班級取消它。 –
嘗試例如: 進口泡菜 MyClass類(對象): @PickleableStaticMethod DEF DoSomething的(A,B): 打印的a,b 酸洗= pickle.dumps(MyClass.dosomething) 德爾MyClass stm = pickle.loads(pickled) –
我想我可能只是說了一些完全錯誤的地方,pickle與我期望的funcs完全不同。忽略我最近的兩條評論: -/ –