(请记住,我正在使用 Python 3 工作,因此解决方案需要在 Python 3 中工作。)
我想使用copyreg
教 Python 如何 pickle 函数的模块。当我尝试这样做时,_Pickler
对象仍然会尝试使用 pickle 函数save_global
功能。 (这不适用于未绑定的方法,这就是这样做的动机。)
这好像是_Pickler
首先尝试审视自己dispatch
在查看之前要选择要腌制的对象的类型copyreg.dispatch_table
。我不确定这是否是故意的。
我有什么方法可以告诉Python使用我提供的reducer来pickle函数吗?
以下 hack 似乎适用于 Python 3.1...:
import copyreg
def functionpickler(f):
print('pickling', f.__name__)
return f.__name__
ft = type(functionpickler)
copyreg.pickle(ft, functionpickler)
import pickle
pickle.Pickler = pickle._Pickler
del pickle.Pickler.dispatch[ft]
s = pickle.dumps(functionpickler)
print('Result is', s)
其中,两条黑客线是:
pickle.Pickler = pickle._Pickler
del pickle.Pickler.dispatch[ft]
您需要删除dispatch
函数类型的条目,否则它会抢占 copyreg 注册;我认为您无法在 C 编码的 Pickler 上执行此操作,因此您需要将其设置为 Python 编码的 Pickler。
子类化会少一些麻烦_Pickler
拥有一个属于你自己的班级dispatch
(复制父类并删除函数类型的条目),然后专门使用您的子类(及其转储方法)而不是pickle.dump
;然而,与泡菜本身的猴子修补相比,它也不太方便。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)