Keine Python-Fehler/bug?
In Python Sie haben die None
singleton, das wirkt ziemlich seltsam, unter bestimmten Umständen:
>>> a = None
>>> type(a)
<type 'NoneType'>
>>> isinstance(a,None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Also erstmal off, <type 'NoneType'>
zeigt, dass None
ist nicht eine Art, aber das NoneType
ist. Doch wenn Sie laufen isinstance(a,NoneType)
, antwortet er mit einem Fehler: NameError: name 'NoneType' is not defined
Nun, angesichts dieser, wenn Sie eine Funktion mit einer Eingabe Standardwert eingestellt None
, und müssen überprüfen möchten, führen Sie die folgenden:
if variable is None:
#do something
else:
#do something
was ist der Grund dafür, dass ich nicht den folgenden statt:
if isinstance(variable,None): #or NoneType
#do something
else:
#do something
Ich bin gerade auf der Suche für eine ausführliche Erklärung, so kann ich besser verstehen, diese
Edit: gute Anwendung
Können sagen, ich wollte isinstance
so, dass ich etwas tun kann, wenn variable
ist eine Vielzahl von Arten, einschließlich None
:
if isinstance(variable,(None,str,float)):
#do something
if variable == None
ist anti-idiomatic Python. Der standard-Weg, um diesen test zu tun ist durch die Nutzung der Tatsache, dassNone
ist ein singleton: verwenden Sieif variable is None
statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen:
isinstance nimmt 2 Argumente
isinstance(object, classinfo)
Hier, indemNone
Sieclassinfo
Keiner, daher der Fehler. Sie müssen pass, die in die Typ.None
ist nicht eine Art, es ist die singleton-Instanz selbst - und das zweite argument vonisinstance
muss ein Typ sein, einer Klasse oder einem Tupel von Ihnen. Daher müssen Sie verwendenNoneType
ausTypen
.Obwohl ich oft geneigt zu ersetzen
isinstance(x, (NoneType, str, float))
mitx is None or isinstance(x, (str, float))
.NoneType
viel, ich würde nur importieren Sie es austypes
. Es scheint überflüssig zu nennentype(None)
wenn Sie können leicht auf diesen Wert.NoneType = type(None)
None
ist das nur ein Wert vontypes.NoneType
es nicht geben.Und der Fehler ist klar genug:
Aus der docs:
Können Sie
types.NoneType
is
Betreiber auch gut funktioniert:None
ist ein Wert(Instanz) und nicht eine Art. Wie die Fehlermeldung zeigt,isinstance
erwartet, dass das zweite argument ein Typ sein.Den Typ None ist
type(None)
oderNonetype
wenn Sie Sie importiert haben (from types import NoneType
)Hinweis: die idiomatischen Weg, um den test zu tun ist
variable is None
. Kurz und beschreibend.