9

我想在 Python 3.x 中腌制一个未绑定的方法。我收到此错误:

>>> class A:
...     def m(self):
...         pass
>>> import pickle
>>> pickle.dumps(A.m)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    pickle.dumps(A.m)
  File "C:\Python31\lib\pickle.py", line 1358, in dumps
    Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
_pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup builtins.function failed

这个事情谁有经验?


注意:在 Python 2.x 中,默认情况下也无法腌制未绑定的方法;我设法以某种我不理解的奇怪方式在那里做到了:我用copy_regMethodType 类的模块编写了一个 reducer,它涵盖了绑定和未绑定的方法。但是reducer只解决了绑定方法的情况,因为它依赖于my_method.im_self. 不可思议的是,它还导致 Python 2.x 能够腌制未绑定的方法。这不会发生在 Python 3.x 上。

4

1 回答 1

7

这不能直接完成,因为在 Python 3 中未绑定的方法类型消失了:它只是一个函数:

>>> print (type (A.m))
<class 'function'>

A.mPython 函数没有绑定到一个类,因此仅仅通过查看表达式结果是不可能知道属于哪个类的。

根据您的确切需要,腌制/取消腌制 (class, method-name) 的元组可能就足够了:

>>> print (pickle.loads (pickle.dumps ((A, 'm'))))
... (<class '__main__.A'>, 'm')

您只需使用以下命令即可从此处获取方法(函数)getattr()

>>> cls, method = pickle.loads (pickle.dumps ((A, 'm')))
>>> print (getattr (cls, method))
... <function m at 0xb78878ec>
于 2010-05-28T18:13:11.517 回答