gpt4 book ai didi

python - 在 Python 3 中 pickle 一个未绑定(bind)的方法

转载 作者:太空狗 更新时间:2023-10-29 20:24:47 27 4
gpt4 key购买 nike

我想在 Python 3.x 中 pickle 一个未绑定(bind)的方法。我收到此错误:

>>> 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 中,默认情况下也不可能 pickle 未绑定(bind)的方法;我设法以某种我不明白的奇怪方式在那里做到了:我用 copy_reg 模块为 MethodType 类编写了一个 reducer,它涵盖了绑定(bind)和未绑定(bind)方法。但是reducer只解决了绑定(bind)方法的情况,因为它依赖于my_method.im_self。神秘的是,它还导致 Python 2.x 能够 pickle 未绑定(bind)的方法。这不会发生在 Python 3.x 上。

最佳答案

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

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

Python 函数不绑定(bind)类,因此无法仅通过查看表达式结果来判断 A.m 属于哪个类。

根据您的具体需要,对 (class, method-name) 的元组进行 pickling/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>

关于python - 在 Python 3 中 pickle 一个未绑定(bind)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com