【发布时间】:2020-01-03 00:09:00
【问题描述】:
我正在尝试腌制和取消腌制datetime.datetime 子类对象。但是,它总是会产生错误,我不知道为什么会这样以及如何解决它。这是最小的例子:
from datetime import datetime, date, time
class A(datetime):
def __new__(cls, year = 2016, month=1, day=1, hour=0, minute=0, leap_year=False):
return datetime.__new__(cls, year ,month, day, hour, minute)
import pickle
obj = A( month=1, day=1, hour=1, leap_year = False)
serial = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL)
unpickle = pickle.loads( serial, encoding='bytes')
这将给出以下错误:
TypeError Traceback (most recent call last)
<ipython-input-2-12195a09d83d> in <module>()
5
6
----> 7 unpickle = pickle.loads( serial, encoding='bytes')
<ipython-input-1-605483566b52> in __new__(cls, year, month, day, hour, minute, leap_year)
2 class A(datetime):
3 def __new__(cls, year = 2016, month=1, day=1, hour=0, minute=0, leap_year=False):
----> 4 return datetime.__new__(cls, year ,month, day, hour, minute)
5
TypeError: an integer is required (got type bytes)
有谁知道问题可能出在哪里以及如何解决?
【问题讨论】:
-
请务必发布整个错误消息,并附上完整的追溯。
-
pickle模块不使用类的__new__()方法来重构它的实例。 -
@martineau。很高兴知道。谢谢。那么如果我想使用pickle,我应该避免使用
__new__吗? -
问题不在于
__new__的使用。 (您甚至可以看到您的__new__在回溯中被调用 - 大多数类不会发生这种情况,但由于datetime自定义酸洗的方式而发生。)问题是datetime酸洗实现不是t 旨在与子类一起使用(除此之外它完全没有文档记录)。 -
序列化和子类化都比看起来复杂得多,但是人们被训练期望序列化和子类化都可以毫不费力地工作。把它们放在一起,问题就更大了。
标签: python datetime pickle python-datetime