Sono stato sorpreso di scoprire che Python (versione 3.2.2) si rifiutava di decapitare un oggetto perché il suo dict conteneva un riferimento a Ellipsis
. Tra gli altri built-in constants, pickle è felice di lavorare con False
, True
e None
, come esplicitamente dichiarato nello pickle documentation, ma anche in soppressione NotImplemented
.Perché Ellipsis e NotImplemented non possono essere decapitati?
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
Per completezza, i meno utili costanti incorporate, __debug__
è solo un bool, quindi non causa problemi; copyright
, license
e credits
funzionano (il loro tipo è site._Printer
); quit
e exit
non (il loro tipo è site.Quitter
, che non può essere trovato poiché è definito all'interno di una funzione).
Qualcuno può spiegare perché questo è - sicuramente Ellipsis
e NotImplemented
non sono stati trascurati? L'unica informazione rilevante che posso trovare è this bug, che lamenta che NoneType
(ovvero, type(None)
) non è selezionabile. Uno dei commentatori menziona che type(Ellipsis)
e type(NotImplemented)
non possono essere decapitati, apparentemente senza notare che le loro istanze non possono essere neanche.
omissione Dispari, anche se si potrebbe sostenere che non dovresti davvero a mantenere i riferimenti a quei valori per cominciare. – millimoose
@Inderdial: il mio caso d'uso particolare era in un contenitore che tiene traccia delle fette a cui è stato effettuato l'accesso. Poiché le fette possono essere decapate, sembra strano che Ellipsis (che è davvero solo un tipo speciale di fetta) non può. Memorizzare un riferimento a "NotImplemented" è probabilmente meno probabile che sia utile, anche se posso immaginare che qualcuno possa volerlo per qualche tipo di complicato schema di confronto. – James
@James - A rigor di termini, 'Ellipsis' non è un tipo speciale di slice, ma la sua interpretazione è assolutamente definita dall'utente. In Numpy, è più simile a una sequenza di zero o più sezioni, determinata automaticamente. –