Pet*_*mit 5 pickle instance-methods python-3.x
实例方法不能在Python 2或Python 3中自动腌制.
我需要使用Python 3 挑选实例方法,并将Steven Bethard的示例代码移植到Python 3:
import copyreg
import types
def _pickle_method(method):
func_name = method.__func__.__name__
obj = method.__self__
cls = method.__self__.__class__
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copyreg.pickle(types.MethodType, _pickle_method, _unpickle_method)
Run Code Online (Sandbox Code Playgroud)
这种方法是否适用于酸洗实例方法?或者有些事情可怕的错误?我用一些模拟类测试了它,一切似乎都有效.
如果什么都不会出错,为什么Python 3中的标准pickle实例方法不可能?
我实际上无法在 python 3.5.0 上重现原始问题,请参阅以下示例。可能值得检查最新版本,看看它是否可以开箱即用:-)
import pickle
import sys
class Foo:
@staticmethod
def my_func():
return 'Foo.my_func'
class Bar:
pass
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == 'restore':
print('loading pickle')
with open('test.pickle', 'rb') as fp:
restored = pickle.load(fp)
print(restored.baz())
else:
print('saving pickle')
b = Bar()
b.baz = Foo.my_func
with open('test.pickle', 'w+b') as fp:
p = pickle.dump(b, fp)
Run Code Online (Sandbox Code Playgroud)
(测试)~/test$ python test.py
节省泡菜
(测试)~/test$ python test.py 恢复
装载泡菜
Foo.my_func
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |