2017-08-24 11 views
1

次の文を酸洗い。この場合、__init__は必要ありませんが、この問題は、他の引数が属性として格納されていて、それを避けることができないOrderedDictというより複雑なサブクラスを持つマルチプロセッシングモジュールを使用することを妨げています。 (私はPython 3.4.6を使用しました)。はOrderedDictのサブクラス

+0

私は他の人に役立つだろうと思ったこの解決策を見つけたかもしれないと思います。追加: – Tom

答えて

1

OrderedDict__reduce__を上書きするため、__init__または__new__メソッドを上書きしたり、追加の属性を保存したりする場合は、上書きする必要があります。

は、あなたのケースでは、必須__init__の引数を作った(それはdictまたはOrderedDictには必須ではありません)ので、あなたは__reduce__を上書きする必要があります。

import collections 

class OD(collections.OrderedDict): 
    def __init__(self, items): 
     super().__init__(items) 

    def __reduce__(self): 
     state = super().__reduce__() 
     # OrderedDict.__reduce__ returns a 5 tuple 
     # the first and last can be kept 
     # the fourth is None and needs to stay None 
     # the second must be set to an empty sequence 
     # the third can be used to store attributes 
     newstate = (state[0], 
        ([],), 
        None, 
        None, 
        state[4]) 
     return newstate 

これは、現在問題なく漬けすることができます。

import pickle 

a = OD((('a',1), ('b', 2))) 

with open('test.pickle','wb') as fout: 
    pickle.dump(a, fout) 

with open('test.pickle','rb') as fin: 
    pickle.load(fin) 

__init__に設定されていない属性を使用するには、まだ正しく機能しません。

a = OD((('a',1), ('b', 2))) 
a.a = 10 

with open('test.pickle','wb') as fout: 
    pickle.dump(a, fout) 

with open('test.pickle','rb') as fin: 
    b = pickle.load(fin) 

b.a # AttributeError: 'OD' object has no attribute 'a' 

上記の__reduce__機能を変更して、3番目の引数を返す必要があります。上記の例は正しく動作します。これにより

class OD(collections.OrderedDict): 
    def __init__(self, items): 
     super().__init__(items) 

    def __reduce__(self): 
     state = super().__reduce__() 
     newstate = (state[0], 
        ([],), 
        self.__dict__, 
        None, 
        state[4]) 
     return newstate 

:たとえば、あなたは、単に__dict__を返すことができます。


多くのデザインは、サブクラスの動作方法によって異なります。場合によっては、2番目の引数(__init__に渡されるもの)を介して項目を渡す方がよいでしょう。あなたの属性を設定する方法について:self.__dict__を使用すると十分な場合もありますが、他の場合は__setstate__を使用する方が安全です。あなたは間違いなくdocumentation of the pickle moduleを読んで、どのアプローチがあなたにとって最適であるかを確認する必要があります。

関連する問題