我想在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类编写了一个带有copy_reg
模块的reducer,它涵盖了绑定和非绑定方法。但是reducer只解决了绑定方法的情况,因为它依赖于my_method.im_self
。神奇的是它也使Python 2.x能够腌制未绑定的方法。这不会发生在Python 3.x上。
答案 0 :(得分:7)
这不能直接完成,因为在Python 3中,未绑定的方法类型消失了:它只是一个函数:
>>> print (type (A.m))
<class 'function'>
Python函数没有绑定到类,因此仅通过查看表达式结果就不可能分辨出A.m
类属于哪个类。
根据您的具体需要,对(类,方法名称)元组进行pickle / unpickling可能就足够了:
>>> 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>