2

これが私がピクルする必要がある私のクラスです:

class sdict(dict):
    def __getattr__(self, attr):
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__
    __reduce__ = dict.__reduce__

__reduce__ピクルスの世話をするべきだと私には思えますが、代わりに:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/daniyar/work/Apr24/<ipython-input-28-1cc94b920737> in <module>()
----> 1 pickle.dumps(sdict(a=1))

/usr/lib/python2.6/pickle.pyc in dumps(obj, protocol)
   1364 def dumps(obj, protocol=None):
   1365     file = StringIO()
-> 1366     Pickler(file, protocol).dump(obj)
   1367     return file.getvalue()
   1368 

/usr/lib/python2.6/pickle.pyc in dump(self, obj)
    222         if self.proto >= 2:
    223             self.write(PROTO + chr(self.proto))
--> 224         self.save(obj)
    225         self.write(STOP)
    226 

/usr/lib/python2.6/pickle.pyc in save(self, obj)
    304             reduce = getattr(obj, "__reduce_ex__", None)
    305             if reduce:
--> 306                 rv = reduce(self.proto)
    307             else:
    308                 reduce = getattr(obj, "__reduce__", None)

/usr/lib/python2.6/copy_reg.pyc in _reduce_ex(self, proto)
     82             dict = None
     83     else:
---> 84         dict = getstate()
     85     if dict:
     86         return _reconstructor, args, dict

TypeError: 'NoneType' object is not callable

ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (171, 0))

私も定義する必要があり__getstate__ますか?カスタム酸洗いに使用できるこれらの複数の方法すべてで完全に迷っています: __getinitargs____getstate____reduce__など...

Google は、私が非常に不明確だと思う公式の pickle ドキュメントのみを参照してくれます。誰かが私のためにそれを明確にするか、良いピクルスのチュートリアルを教えてもらえますか?

4

1 に答える 1

5

あなたが良い道を進んでいるかどうか、私は疑問に思います。

しかし、ピクルスの問題を解決するには:

class sdict(dict):
    def __getattr__(self, attr):
        if attr.startswith('__'):
            raise AttributeError
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

Pickle はオブジェクトから状態を取得しようとしていますが、dict はそれを実装していません。あなた__getattr__はその魔法のメソッドを見つけるために呼び出されており、必要に応じて"__getstate__"レイズする代わりに None を返しAttributeErrorています。を修正する__getattr__と、pickle は正常に動作します。

実際、欠落している属性に対して None を返すのはなぜですか? それは本当にあなたのオブジェクトにやりたいことですか?

これは、あなたがしようとしているビルトインを偽造することの難しさの例です。隠れたところで微妙なことが起こっており、あなたはそれに関与する必要があります.

PS:同じ質問です。

于 2012-04-28T15:04:11.443 に答える