【发布时间】:2010-12-27 05:18:59
【问题描述】:
我一直在尝试腌制一个包含对静态类方法的引用的对象。
Pickle 失败(例如在 module.MyClass.foo 上)说明它不能被腌制,因为 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),但以下模式会很棒:
我的类(对象):
@picklable_staticmethod
定义 foo():
打印“完成”。
我在这方面的尝试没有成功,特别是因为我无法从 foo 函数中提取所有者类。我什至愿意接受明确的规范(例如@picklable_staticmethod(MyClass)),但我不知道有什么方法可以在定义它的地方引用MyClass 类。
任何想法都会很棒!
约拿坦
【问题讨论】:
标签: python static-methods pickle