这是pickle实例方法的正确方法吗?如果是的话,为什么不在Python 3中呢?

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实例方法不可能?

Ani*_*ift 0

我实际上无法在 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