5

(请记住,我正在使用 Python 3,因此解决方案需要在 Python 3 中运行。)

我想使用该copyreg模块来教 Python 如何腌制函数。当我尝试这样做时,该_Pickler对象仍会尝试使用该函数来腌制save_global函数。(这对于未绑定的方法不起作用,这就是这样做的动机。)

在查看之前,似乎_Pickler首先尝试在其自身dispatch中查找要腌制的对象的类型copyreg.dispatch_table。我不确定这是否是故意的。

我有什么方法可以告诉 Python 使用我提供的 reducer 来腌制函数吗?

4

1 回答 1

1

以下 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; 然而,这种泡菜本身的猴子补丁也不太方便。

于 2010-05-29T03:06:51.873 回答