我一直在尝试pickle一个包含对静态类方法的引用的对象。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这样一个对象呢?我不想对全局pickle过程进行更改(例如使用copy_reg),但以下模式会很棒: class MyClass(object): @picklable_staticmethod def foo(): print "done." 我的尝试都没有成功,具体原因是我无法从foo函数中提取owner类。我甚至愿意接受明确的规定(例如@picklable_staticmethod(MyClass)),但我不知道任何一种方式可以在定义它的地方引用MyClass类。 任何想法都会很棒!