Python 3.9: la eliminación de datos de IsoCalendarDate devuelve una tupla
Considere la siguiente discusión / característica en Python3.9: https://bugs.python.org/issue24416
En resumen, se decidió que el resultado de datetime.date.isocalendarse cambiaría a a en namedtuplelugar de tuple.
Ahora, puedo ver el beneficio de hacer eso, pero también decidieron "encurtir" el nuevo objeto ( datetime.IsoCalendarDate) como una tupla:
https://github.com/python/cpython/commit/1b97b9b0ad9a2ff8eb5c8f2e2e7c2aec1d13a330#diff-2a8962dcecb109859cedd81ddc5729bea57d156e0947cb8413f99781a0860fd1R1214
Entonces, mi pregunta es, ¿por qué hicieron que la creación del objeto directamente y el "decapado y despeinado" del objeto requirieran flujos ligeramente diferentes?
Por ejemplo:
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)
Resultados en:
$ 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'
Esta inconsistencia me parece inestable. ¿Ocurre en otros lugares del idioma?
Respuestas
Supongo, como sugiere el comentario de Batman en esta respuesta :
Una es que
namedtupleno es una clase, es una fábrica de clases que devuelve una clase, que a su vez usa para crear instancias. (...)
Y desafortunadamente, este es exactamente el caso (¡intencionalmente!) Como podemos leer en el código de IsoCalendarDate(tuple)clase:
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),))
Entonces, parece que, por alguna razón , el enfoque intrascendente se tomó intencionalmente, pero no tengo conocimiento de (m) situaciones similares en el código de Python.
Creo que puedes plantearlo como un error. Tal vez debería revisarse la razón fundamental para mantener la IsoCalendarDateprivacidad desde la pickleperspectiva.