简体   繁体   English

Python:类实例的pickle.loads失败了

[英]Python: pickle.loads failed for class instance

I need tzinfo class for datetime object in my class. 我需要在我的类中使用tzinfo类作为datetime对象。 I need to pickle my class. 我需要挑选我的课。 But pickle.loads(obj) failed. 但是pickle.loads(obj)失败了。 What's wrong with mytz class? mytz课有什么问题? If I do not use mytz class everything works. 如果我不使用mytz课程,一切正常。 Why? 为什么?

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)

here is output: 这是输出:

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'

We should add __getinitargs__() method to our custom class. 我们应该将__getinitargs__()方法添加到我们的自定义类中。 And dump our arguments somewhere: 并在某处转储我们的论点:

self.args = offset, dst

tzinfo is abstract class with __reduce__ method. tzinfo是带有__reduce__方法的抽象类。 __reduce__ trying to invoke __getinitars__() method. __reduce__试图调用__getinitars__()方法。 But always stuck with None value. 但总是坚持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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM