Я с удивлением обнаружил, что python (версия 3.2.2) отказывается рассортировать объект, потому что его dict содержал ссылку на Ellipsis
. Из других built-in constants рассол счастлив работать с False
, True
и None
, как указано в pickle documentation, но также дроссели на NotImplemented
.Почему нельзя использовать эллипсис и 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
Для полноты из менее полезных встроенных констант, __debug__
просто BOOL, поэтому не вызывает никаких проблем; copyright
, license
и credits
работа (их тип site._Printer
); quit
и exit
нет (их тип site.Quitter
, который не может быть найден как определено внутри функции).
Может кто-нибудь объяснить, почему это - наверняка Ellipsis
и NotImplemented
не просто упустили? Единственная релевантная информация, которую я могу найти, - this bug, которая жалуется, что NoneType
(т. Е. type(None)
) не подбирается. Один из комментаторов упоминает, что type(Ellipsis)
и type(NotImplemented)
не могут быть маринованными, по-видимому, не замечая, что их экземпляры тоже не могут быть.
Odd упущение, хотя можно было бы утверждать, что вы на самом деле не должны держать ссылки на те значения, чтобы начать с. – millimoose
@Inderdial: мой конкретный пример использования был в контейнере, который отслеживает фрагменты, к которым был осуществлен доступ. Поскольку ломтики можно мариновать, кажется странным, что Ellipsis (который на самом деле является только особым видом среза) не может. Сохранение ссылки на «NotImplemented», вероятно, менее вероятно, будет полезно, хотя я могу себе представить, что кто-то может захотеть его для какой-то сложной схемы сравнения. – James
@James - Строго говоря, «Эллипсис» не является особым видом среза, но его интерпретация абсолютно определяется пользователем. В Numpy это больше похоже на последовательность из нуля или более секций, определяемую автоматически. –