1

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

简而言之,决定将结果datetime.date.isocalendar更改为 anamedtuple而不是tuple

datetime.IsoCalendarDate现在,我可以看到这样做的好处,但他们也决定将新对象(

所以我的问题是,他们为什么要直接创建对象和“腌制和解封”对象需要稍微不同的流程?

例如:

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'

这种不一致对我来说看起来很不稳定。它是否发生在该语言的其他地方?

4

1 回答 1

1

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

一个是它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),))

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

我认为您可以将其作为错误提出。也许应该重新审视从这个角度保持IsoCalendarDate隐私的理由。pickle

于 2020-10-18T08:47:39.893 回答