在Python 3中对未绑定方法进行序列化
我想在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中,默认情况下也无法序列化未绑定的方法。我曾经用一种我不太理解的奇怪方法成功做到过:我为MethodType类写了一个“减速器”(reducer),这个类可以处理绑定和未绑定的方法。但是这个减速器只解决了绑定方法的情况,因为它依赖于my_method.im_self
。神奇的是,这也让Python 2.x能够序列化未绑定的方法。但在Python 3.x中,这种情况就不再发生了。
1 个回答
7
这件事不能直接做到,因为在Python 3中,所谓的“未绑定方法”已经不存在了:它现在只是一个普通的函数。
>>> print (type (A.m))
<class 'function'>
Python中的函数并不属于某个特定的类,所以光看表达式的结果,你无法判断A.m
属于哪个类。
根据你的具体需求,将一个包含(类,方法名)的元组进行序列化和反序列化可能就足够了:
>>> 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>