gpt4 book ai didi

Python:类实例的 pickle.loads 失败

转载 作者:行者123 更新时间:2023-11-28 16:26:24 25 4
gpt4 key购买 nike

我的类(class)中的日期时间对象需要 tzinfo 类。我需要 pickle 我的类(class)。但是 pickle.loads(obj) 失败了。 mytz 类有什么问题?如果我不使用 mytz 类,一切正常。为什么?

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__() 方法添加到我们的自定义类中。并将我们的论点转储到某个地方:

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

关于Python:类实例的 pickle.loads 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36238351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com