Python:类实例的pickle.loads失败 [英] Python: pickle.loads failed for class instance

查看:395
本文介绍了Python:类实例的pickle.loads失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的班级中的日期时间对象需要tzinfo类.我需要给我的课上泡菜.但是pickle.loads(obj)失败了. mytz类怎么了?如果我不使用mytz类,则一切正常.为什么?

I need tzinfo class for datetime object in my class. I need to pickle my class. But pickle.loads(obj) failed. What's wrong with mytz class? If I do not use mytz class everything works. 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)

这里是输出:

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'

推荐答案

我们应该在自定义类中添加__getinitargs__()方法. 并将我们的论点放在某个地方:

We should add __getinitargs__() method to our custom class. And dump our arguments somewhere:

self.args = offset, dst

tzinfo是具有__reduce__方法的抽象类. __reduce__尝试调用__getinitars__()方法. 但始终停留在None值上.

tzinfo is abstract class with __reduce__ method. __reduce__ trying to invoke __getinitars__() method. But always stuck with None value.

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

这篇关于Python:类实例的pickle.loads失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆