Реализация NoneType, причины и детали
Я недавно где-то читал, что особое значениеNone
в Python это объект-одиночка своего класса, в частности,NoneType
, Это многое объясняет, так как большинство ошибок, связанных сNone
в питоне производятAttributeError
s вместо какого-то особенного "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?