2016-03-26 10 views
3

私のクラスのdatetimeオブジェクトにはtzinfoクラスが必要です。私は自分のクラスをピクルする必要があります。しかし、pickle.loads(obj)は失敗しました。 mytzクラスの何が問題になっていますか?私がmyzzクラスを使用しない場合、すべてが機能します。どうして?ここPython:クラスインスタンスのpickle.loadsが失敗しました

from datetime import datetime, tzinfo, timedelta 

# Timezone class 
class mytz (tzinfo): 
    def __init__(self, offset, dst): 
     self._tzname = offset + ' ' + dst 
     self._offset = timedelta(hours=int(offset[0:3]), minutes=int(offset[0:1]+offset[3:])) 
     self._dst = timedelta(hours=int(dst[0:3]), minutes=int(dst[0:1]+dst[3:])) 
    def utcoffset(self, dt): 
     return self._offset + self.dst(dt) 
    def tzname(self, dt): 
     return self._tzname 
    def dst(self, dt): 
     return self._dst 

# Root class 
class A: 
    def __init__(self, val): 
     self.val = val 
     self.val2 = mytz(val, val) 
    def __str__(self): 
     return 'response'+str(self.val) 
# Sample code 
a = A('+0100') 

import pickle 
apickled = pickle.dumps(a) 
print (a) 
print (a.val2) 
b = pickle.loads(apickled) 
print (b) 
print(b.val2) 

が出力されます。

response+0100 
<__main__.mytz object at 0x7fe2873b5748> 
Traceback (most recent call last): 
    File "/home/maksim/Projects/amodule/ttt.py", line 32, in <module> 
    b = pickle.loads(apickled) 
TypeError: __init__() missing 2 required positional arguments: 'offset' and 'dst' 

答えて

3

私たちは、カスタムクラスに__getinitargs__()メソッドを追加する必要があります。 そして、どこかで私たちの引数をダンプ:

self.args = offset, dst 

tzinfo__reduce__方法と抽象クラスです。 __reduce____getinitars__()メソッドを呼び出そうとしています。 しかし、常にNoneの値に固執しています。

class mytz (tzinfo): 
    def __init__(self, offset, dst): 
     self.args = offset, dst 
     self._tzname = offset + ' ' + dst 
     self._offset = timedelta(
      hours=int(offset[0:3]), minutes=int(offset[0:1] + offset[3:])) 
     self._dst = timedelta(
      hours=int(dst[0:3]), minutes=int(dst[0:1] + dst[3:])) 

    def utcoffset(self, dt): 
     return self._offset + self.dst(dt) 

    def tzname(self, dt): 
     return self._tzname 

    def dst(self, dt): 
     return self._dst 

    def __getinitargs__(self): 
     return self.args 
関連する問題