Implementierung von NoneType, Gründen und Details
Ich habe kürzlich irgendwo gelesen, dass der besondere WertNone
in python ist speziell ein singleton-objekt seiner eigenen klasseNoneType
. Das hat viel erklärt, da die meisten Fehler involviert sindNone
in Python produzierenAttributeError
s statt eines speziellen "NoneError" oder so.
Da alle dieseAttributeErrors
spiegelte die Attribute, dieNoneType
fehlte, wurde ich von welchen Eigenschaften fasziniertNoneType
tat haben, wenn überhaupt.
Ich beschloss, das zu untersuchenNoneType
und erfahre mehr darüber. Ich habe immer herausgefunden, dass es der beste Weg ist, etwas über eine neue Sprachfunktion zu lernen, sie zu verwenden. Deshalb habe ich versucht, sie zu instanziierenNoneType
im LEERLAUF:
>>> n = NoneType()
Dies verursachte einen Fehler:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
n = NoneType()
NameError: name 'NoneType' is not defined
Verwirrt inspizierte ichNone
um zu sehen, ob ich den richtigen Typnamen gefunden habe. Sicher genug,
>>> type(None)
<class 'NoneType'>
Jetzt sehr verwirrt, habe ich eine schnelle Google-Suche durchgeführt. Dies ergab, dassAus irgendeinem Grund wurde NoneType in Python 3 entfernt.
Nun ich aber, ha ha! Ich kann das umgehen, indem ich den Typ von speichereNone
in einer Variablen, daKlassen sind Objekte in Python. Das schien zu funktionieren:
>>> NoneType = type(None)
>>> n = NoneType()
Und als ich n druckte, bekam ich ziemlich genau das, was ich erwartet hatte:
>>> print(n)
None
Aber dann passierte folgendes:
>>> n is None
True
Und:
>>> id(n)
506768776
>>> id(None)
506768776
Meine Variablen
ISTNone
. Nicht nur der gleiche Typ wieNone
. Es istNone
. Das habe ich nicht erwartet.
Ich habe versucht mitdis
um mehr Informationen zu erhaltenNoneType
, aber als ich anrief
>>> dis.dis(type(None))
Es wurde keine Ausgabe erzeugt.
Ich habe dann dann versucht das zu untersuchen__new__
Methode, die mehrere Benutzer in den Kommentaren erwähnt hatten:
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
>>>
Weitere Fehler.
Hier sind meine Fragen:
Warum istn
das exakt gleiche Objekt wieNone
?Warum wurde die Sprache so gestaltet, dassn
ist genau das gleiche Objekt wieNone
?Wie würde man dieses Verhalten überhaupt in Python umsetzen?