Python:类实例的pickle.loads失败 [英] Python: pickle.loads failed for class instance
本文介绍了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屋!
查看全文