J'ai été surpris de constater que python (version 3.2.2) refusait de décaper un objet parce que son dict contenait une référence à Ellipsis
. De l'autre built-in constants, cornichon est heureux de travailler avec False
, True
, et None
, comme indiqué explicitement dans le pickle documentation, mais étouffe également sur NotImplemented
.Pourquoi Ellipsis et NotImplemented ne peuvent-ils pas être décapés?
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
Pour être complet, des constantes intégrées moins utiles, __debug__
est juste un bool, provoque donc pas de problèmes; copyright
, license
, et credits
travail (leur type est site._Printer
); quit
et exit
pas (leur type est site.Quitter
, qui ne peut pas être trouvé car il est défini dans une fonction).
Quelqu'un peut-il expliquer pourquoi c'est - sûrement Ellipsis
et NotImplemented
n'ont pas été négligés? La seule information pertinente que je peux trouver est this bug, qui se plaint que NoneType
(c'est-à-dire type(None)
) n'est pas décollable. Un des commentateurs mentionne que type(Ellipsis)
et type(NotImplemented)
ne peuvent pas être décapés, apparemment sans remarquer que leurs instances ne peuvent pas être non plus.
omission Odd, mais on pourrait dire que vous êtes censé ne pas vraiment garder les références à ces valeurs pour commencer. – millimoose
@Inderdial: mon cas d'utilisation particulier était dans un conteneur qui garde la trace des tranches qui ont été accédées. Puisque les tranches peuvent être décapées, il semble étrange que Ellipsis (qui est vraiment juste un genre spécial de tranche) ne peut pas. Stocker une référence 'NotImplemented' est probablement moins susceptible d'être utile, bien que j'imagine que quelqu'un pourrait vouloir pour une sorte de schéma de comparaison compliqué. – James
@James - Strictement parlant, 'Ellipsis' n'est pas un genre particulier de tranche, mais son interprétation est absolument définie par l'utilisateur. En Numpy, il s'agit plus d'une séquence de zéro ou plusieurs tranches, déterminée automatiquement. –