Python 3.9:取消拾取IsoCalendarDate数据将返回一个元组



考虑Python 3.9中的以下讨论/功能:https://bugs.python.org/issue24416

简而言之,决定将datetime.date.isocalendar的结果改变为namedtuple而不是tuple

现在,我可以看到这样做的好处,但他们也决定"腌制";将新对象(datetime.IsoCalendarDate(作为元组:
https://github.com/python/cpython/commit/1b97b9b0ad9a2ff8eb5c8f2e2e7c2aec1d13a330#diff-2a8962dcecb109859cedd81ddc5729bea57d156e0947cb8413f99781a0860fd1R1214

所以我的问题是,他们为什么要直接创建对象;酸洗和去pickle";对象需要稍微不同的流量?

例如:

import datetime
from pathlib import Path
import pickle

RESULTS_CACHE_PICKLE = Path('cache.pickle')

if RESULTS_CACHE_PICKLE.is_file():
with open(RESULTS_CACHE_PICKLE, 'rb') as f:
icd = pickle.load(f)
else:
icd = datetime.date(2019, 1, 1).isocalendar()
with open(RESULTS_CACHE_PICKLE, 'wb') as f:
pickle.dump(icd, f)


print(icd.year)

结果:

$ python icd_test.py
2019
$ python icd_test.py
Traceback (most recent call last):
File "icd_test.py", line 19, in <module>
print(icd.year)
AttributeError: 'tuple' object has no attribute 'year'

这种不一致在我看来是不稳定的。这种情况在语言的其他地方发生吗?

我想,正如蝙蝠侠在这个答案中的评论所建议的那样:

一个是namedtuple不是类,它是类工厂返回一个类,然后使用该类生成实例。(…(

不幸的是,正如我们在IsoCalendarDate(tuple)类的代码中所读到的那样,情况正是如此(有意!(:

def __reduce__(self):
# This code is intended to pickle the object without making the
# class public. See https://bugs.python.org/msg352381
return (tuple, (tuple(self),))

因此,出于某种原因,似乎有意采取了这种无关紧要的方法,但我不知道Python代码中有任何类似的情况。

我想你可以把它当作虫子养。也许从pickle的角度来看,保持IsoCalendarDate私有化的理由应该重新审视。

最新更新