静的クラス メソッドへの参照を含むオブジェクトをピクルしようとしています。Pickle は (たとえば で)存在しないためmodule.MyClass.foo
、pickle できないことを示して失敗します。
次の解決策を思いつきました。ラッパー オブジェクトを使用して呼び出し時に関数を見つけ、コンテナー クラスと関数名を保存します。module.foo
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
例を使用)、次のパターンは素晴らしいでしょう: class MyClass(object): @picklable_staticmethod def foo(): print "done."
foo
特に関数から所有者クラスを抽出できなかったため、これに対する私の試みは失敗しました。私は明示的な仕様 ( など) で解決するつもりでしたが、クラスが定義されている場所でクラス@picklable_staticmethod(MyClass)
を参照する方法を知りません。MyClass
どんなアイデアも素晴らしいでしょう!
よなたん