Me sorprendió encontrar que python (versión 3.2.2) se negaba a recuperar un objeto porque su dict contenía una referencia a Ellipsis
. Del otro built-in constants, pickle está feliz trabajando con False
, True
y None
, como se indica explícitamente en el pickle documentation, pero también se ahoga en NotImplemented
.¿Por qué no se pueden salpicar Ellipsis y NotImplemented?
Python 3.2.2 (default, Sep 5 2011, 21:17:14)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.dumps(True)
b'\x80\x03\x88.'
>>> pickle.dumps(False)
b'\x80\x03\x89.'
>>> pickle.dumps(None)
b'\x80\x03N.'
>>> pickle.dumps(Ellipsis)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'ellipsis'>: attribute lookup builtins.ellipsis failed
>>> pickle.dumps(NotImplemented)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'NotImplementedType'>: attribute lookup builtins.NotImplementedType failed
Para completar, de las constantes integradas en menos útiles, __debug__
es sólo un bool, por lo que no causa ningún problema; copyright
, license
, y credits
trabajo (su tipo es site._Printer
); quit
y exit
no (su tipo es site.Quitter
, que no se puede encontrar como se define dentro de una función).
¿Alguien puede explicar por qué esto es - seguramente Ellipsis
y NotImplemented
no se han pasado por alto? La única información relevante que puedo encontrar es this bug, que se queja de que NoneType
(es decir, type(None)
) no es seleccionable. Uno de los comentaristas menciona que type(Ellipsis)
y type(NotImplemented)
no pueden ser escabechados, aparentemente sin darse cuenta de que sus instancias tampoco pueden serlo.
extraña omisión, aunque se podría argumentar que no se supone realmente para mantener las referencias a esos valores, para empezar. – millimoose
@Inderdial: mi caso de uso particular estaba en un contenedor que realiza un seguimiento de los sectores a los que se ha accedido. Como las rebanadas pueden ser escabechadas, parece extraño que las elipsis (que en realidad son solo un tipo especial de corte) no puedan. Guardar una referencia a 'NotImplemented' probablemente sea menos útil, aunque me imagino que alguien podría quererlo por algún tipo de esquema de comparación complicado. – James
@James - Estrictamente hablando, 'Ellipsis' no es un tipo especial de porción, pero su interpretación está absolutamente definida por el usuario. En Numpy, se parece más a una secuencia de cero o más sectores, determinada automáticamente. –