Почему Ellipsis и NotImplemented не могут быть pickled?

Я с удивлением обнаружил, что python (версия 3.2.2) отказывается пикировать объект, потому что его dict содержит ссылку на Ellipsis. Из других встроенных констант pickle с удовольствием работает с False, True и None, как явно указано в документации pickle, но также подавляется 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 "", line 1, in 
_pickle.PicklingError: Can't pickle : attribute lookup builtins.ellipsis failed
>>> pickle.dumps(NotImplemented)
Traceback (most recent call last):
  File "", line 1, in 
_pickle.PicklingError: Can't pickle : attribute lookup builtins.NotImplementedType failed

Для полноты картины, из менее полезных встроенных констант, __debug__ является просто bool, поэтому не вызывает проблем; copyright, license и credits работают (их тип - site. _Printer); quit и exit не работают (их тип - site.Quitter, который не может быть найден, поскольку он определен внутри функции).

Кто-нибудь может объяснить, почему это так - наверняка Ellipsis и NotImplemented не были просто пропущены? Единственная релевантная информация, которую я могу найти, это this bug, в которой жалуется, что NoneType (то есть, type(None)) не является picklable. Один из комментаторов упоминает, что type(Ellipsis) и type(NotImplemented) нельзя мариновать, видимо, не замечая, что их экземпляры тоже нельзя.

12
задан James 23 January 2012 в 14:34
поделиться