Реализация NoneType, причины и детали

Я недавно где-то читал, что особое значениеNone в Python это объект-одиночка своего класса, в частности,NoneType, Это многое объясняет, так как большинство ошибок, связанных сNone в питоне производятAttributeErrors вместо какого-то особенного "NoneError" или чего-то еще.

Поскольку все этиAttributeErrors отразил атрибуты, которыеNoneType не хватало, меня заинтриговали какие атрибутыNoneType сделал есть, если есть.

Я решил посмотреть на этоNoneType и узнать больше об этом. Я всегда находил, что лучший способ узнать о новой языковой функции - это использовать ее, поэтому я попытался создать экземплярNoneType в бездействии:

>>> n = NoneType()

Это привело к ошибке:

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
    n = NoneType()
NameError: name 'NoneType' is not defined

Смущенный, я осмотрелNone чтобы убедиться, что я правильно понял имя типа. Конечно же,

>>> type(None)
<class 'NoneType'>

Теперь очень смущен, я сделал быстрый поиск в Google. Это показало, чтопо какой-то причине NoneType был каким-то образом удален в Python 3.

Ну, я, хотя, ха-ха! Я могу обойти это, сохраняя типNone в переменной, так какклассы являются объектами в Python. Казалось, это работает:

>>> NoneType = type(None)
>>> n = NoneType()

И когда я напечатал n, я получил почти то, что ожидал:

>>> print(n)
None

Но потом это случилось:

>>> n is None
True

А также:

>>> id(n)
506768776
>>> id(None)
506768776

Моя переменнаяn ЯВЛЯЕТСЯNone, Не только того же типа, что иNone, Это являетсяNone, Это не то, что я ожидал.

Я пытался с помощьюdis чтобы получить больше информации оNoneType, но когда я позвонил

>>> dis.dis(type(None))

Это не произвело никакого выхода.

Затем я попытался расследовать__new__ метод, который несколько пользователей упомянули в комментариях:

dis.dis(type(None).__new__)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    dis.dis(type(None).__new__)
  File "C:\Python33\lib\dis.py", line 59, in dis
    type(x).__name__)
TypeError: don't know how to disassemble builtin_function_or_method objects
>>> 

Больше ошибок.

Вот мои вопросы:

Почемуn точно такой же объект, какNone?Почему язык был разработан так, чтоn точно такой же объект, какNone?Как можно реализовать это поведение в python?

Ответы на вопрос(4)

Ваш ответ на вопрос