以下 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
使用您自己的类进行子类化dispatch
(复制父类并删除函数类型的条目),然后专门使用您的子类(及其转储方法)而不是pickle.dump
; 然而,这种泡菜本身的猴子补丁也不太方便。