5

インスタンス メソッドは、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)

このメソッドは、インスタンス メソッドを酸洗するための絶対確実なものですか? または、いくつかのことがひどく間違っている可能性がありますか? いくつかのモックアップクラスでテストしましたが、すべてうまくいくようです。

何も問題が起きないのなら、Python 3 で標準のピクル インスタンス メソッドを使用できないのはなぜですか?

4

2 に答える 2

0

クラス インスタンス (およびインスタンス メソッド) をピクルしたい場合は、単にdill...を使用します。

>>> import dill
>>> 
>>> class Foo:
...   def bar(self, x):
...     return self.y + x
...   def zap(self, y):
...     self.y = y
...   y = 1
... 
>>> f = Foo()
>>> f.zap(4)
>>> f.monty = 'python'
>>> 
>>> _f = dill.dumps(f)
>>> del Foo
>>> del f
>>> f = dill.loads(_f)
>>> f.monty
'python'
>>> f.y
4
>>> 
>>> _b = dill.dumps(f.bar)
>>> del f
>>> bar = dill.loads(_b)
>>> bar(4)
8
>>> 

dill上記のように、クラスオブジェクトを削除すると機能します...したがって、クラスを定義せずに新しいpythonセッションを開始した場合、またはクラス定義を変更した場合にも機能します. dillクラス オブジェクトのインスタンスがない場合や、利用可能なクラス インスタンスがない場合でも機能します。その方法を確認したい場合は、dillソース コードを参照してください: https://github.com/uqfoundation/dill

関連も参照してください: https://stackoverflow.com/a/21345273/2379433

于 2015-09-24T14:15:06.133 に答える