1

pickle に問題があります: 使用例がトリッキーで、pickle したオブジェクトの複製が返されません。私が始めるなら

class OneArg(object):
    def __init__(self, somearg, *args, **kwargs):
        print "In OneArgs's init with args={} and kwargs={}".format(args, kwargs)
        self._somearg = somearg
        super(OneArg, self).__init__(*args, **kwargs)

class OneArgSubclass(OneArg, OrderedDict):
    def __init__(self, *args, **kwargs):
        print "In OneArgSubclass's init with args={} and kwargs={}".format(args, kwargs)
        super(OneArgSubclass, self).__init__(*args, **kwargs)


def verbose_pickle_dumps (obj):
    result = pickle.dumps(obj)
    print result
    return result


oas = OneArgSubclass("SOMEARG")
oas['spam'] = 'eggs'
oas_red = pickle.loads(verbose_pickle_dumps(oas))
print "oas_red.keys():", oas_red.keys()

これが私が得る出力です:

In OneArgSubclass's init with args=('SOMEARG',) and kwargs={}
In OneArgs's init with args=() and kwargs={}
oas.keys(): ['spam']

c__main__
OneArgSubclass
p0
((lp1
(lp2
S'spam'
p3
aS'eggs'
p4
aatp5
Rp6
(dp7
S'_somearg'
p8
S'SOMEARG'
p9
sb. 

In OneArgSubclass's init with args=([['spam', 'eggs']],) and kwargs={}
In OneArgs's init with args=() and kwargs={}
oas_red.keys(): []

oas をピクルすると、'spam'/'eggs' キーと値のペアがそこにあり、_somearg の値もそこにあることがわかります。ただし、文字列「OrderedDict」は表示されないことに注意してください。pickle から oas を読み込もうとすると、文字列 'SOMERG' が取得されないため、代わりに辞書の内容が _somearg の値になります。

私が見たところ、oasには __getinitargs__() も __getnewargs__() もありません。OrderedDict の代わりに通常の dict を使用すると、コードが機能します (「copy_reg」への言及を含め、pickle 表現はかなり異なって見えます)。しかし、私が OrderedDict を単独で操作する場合、pickle は正常に機能します。

4

2 に答える 2

1

何かをピクルするとき、データを抽出してアンピクルでオブジェクトを再作成するために使用できるいくつかの異なる方法があります。あなたが直面している問題はOrderedDict、それらの 1 つ ( ) を定義することです__reduce__が、それが返すものはあなたのものと互換性がありません__init__

def __reduce__(self):
    return (self.__class__, (self._somearg, tuple(self.items())))
于 2013-10-31T19:54:28.257 に答える
0

http://bytes.com/topic/python/answers/781057-pickle-instance-custom-class__repr__()のように、クラスにメソッドを実装することもできます。

彼らの例では、 からクラスを派生させ、この方法でメソッドOrderedDictを実装しています。__repr__()

def __repr__(self):
        return '{%s}' % ', '.join([': '.join([repr(k),str(v)]) \
                                   for k,v in zip(self.keys(), self.values())])

クラス__init()__が立つとき

class OrderedDict(dict):

    def __init__(self, d = None):
        self._keys = []
        if d == None: d = {}
        self.update(d)
于 2013-11-01T04:16:08.040 に答える