Wie kann man NoneType in Python "testen"?


398

Ich habe eine Methode, die manchmal einen NoneType-Wert zurückgibt. Wie kann ich eine Variable in Frage stellen, die kein Typ ist? Ich muss zum Beispiel die if- Methode verwenden

if not new:
    new = '#'

Ich weiß, dass das der falsche Weg ist und ich hoffe, Sie verstehen, was ich meinte.


Ich denke, dies wurde hier und anscheinend irgendwo zuvor beantwortet
yorodm

Wenn Noneist die einzige Ihre Methode zurückgibt Wert , für den bool(returnValue)gleich False, dann if not new:sollte gut funktionieren. Dies tritt manchmal in den integrierten Bibliotheken auf - gibt beispielsweise re.matchentweder None oder ein wahrheitsgemäßes Übereinstimmungsobjekt zurück.
Kevin

Siehe auch meine Antwort über nullund Nonein Python hier .
Michael Ekoka

Antworten:


631

Wie kann ich eine Variable in Frage stellen, die kein Typ ist?

Verwenden Sie den isOperator wie folgt

if variable is None:

Warum funktioniert das?

Da dies Nonedas einzige Singleton-Objekt NoneTypein Python ist, können wir mit dem isOperator prüfen, ob eine Variable darin enthalten ist Noneoder nicht.

Zitieren aus isDokumenten ,

Die Betreiber is und is notTest für die Objektidentität: x is yist wahr , wenn und nur wenn xund ydasselbe Objekt sind. x is not yergibt den inversen Wahrheitswert.

Da es nur eine Instanz von geben kann None, iswäre dies die bevorzugte Methode zur Überprüfung None.


Hören Sie es aus dem Maul des Pferdes

Zitieren von Pythons Coding Style Guidelines - PEP-008 (gemeinsam von Guido selbst definiert),

Vergleiche zu Singletons mag Nonesollte immer mit durchgeführt werden isoderis not , nie die Gleichheitsoperator .


Was ist der Unterschied zwischen == Noneund is None?
NoName

@NoName In Bezug auf Nonewerden beide ähnliche Ergebnisse liefern.
thefourtheye

1
Dies funktioniert nicht, wenn verglichen wird, ob ein pandasDataFrame vorhanden ist. Dazu type(df) is type(None)vermeide ich The truth value of a DataFrame is ambiguous
Folgendes


27

Dies kann auch isinstancegemäß der Antwort von Alex Hall erfolgen :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance ist auch intuitiv, aber es gibt die Komplikation, dass es die Leitung erfordert

NoneType = type(None)

was für Typen wie intund nicht benötigt wird float.


Da Sie keine Unterklasse haben können NoneTypeund da Nonees sich um ein Singleton handelt, isinstancesollte es nicht zum Erkennen verwendet werden None- stattdessen sollten Sie tun, was in der akzeptierten Antwort steht, und is Noneoder verwenden is not None.
Aaron Hall

18

Wie in Aaron Halls Kommentar hervorgehoben:

Da Sie keine Unterklasse haben können NoneTypeund da Nonees sich um ein Singleton handelt, isinstancesollte es nicht zum Erkennen verwendet werden None- stattdessen sollten Sie tun, was in der akzeptierten Antwort steht, und is Noneoder verwenden is not None.


Ursprüngliche Antwort:

Der einfachste Weg jedoch ohne die zusätzliche Zeile zusätzlich zu Kardamoms Antwort ist wahrscheinlich:
isinstance(x, type(None))

Wie kann ich eine Variable in Frage stellen, die kein Typ ist? Ich muss if-Methode verwenden

Für die Verwendung isinstance()ist keine Anweisung isinnerhalb der ifAnweisung erforderlich :

if isinstance(x, type(None)): 
    #do stuff

Zusätzliche Informationen
Sie können auch in einer isinstance()Anweisung nach mehreren Typen suchen, wie in der Dokumentation erwähnt . Schreiben Sie die Typen einfach als Tupel.

isinstance(x, (type(None), bytes))

1
Da Sie keine Unterklasse haben können NoneTypeund da Nonees sich um ein Singleton handelt, isinstancesollte es nicht zum Erkennen verwendet werden None- stattdessen sollten Sie tun, was in der akzeptierten Antwort steht, und is Noneoder verwenden is not None.
Aaron Hall

1
Diese Antwort war nützlich fürpython 3.6.7
Santhosh Dhaipule Chandrakanth

@AaronHall Warum isinstance sollte nicht verwendet werden? Ich verstehe, dass isdies bevorzugt werden sollte, aber es gibt einige Fälle, in denen sich das isinstance-Formular natürlicher anfühlt (wie das gleichzeitige Überprüfen auf mehrere Typen isinstance(x, (str, bool, int, type(None)))). Ist es nur eine persönliche Präferenz oder gibt es eine Einschränkung, die mir nicht bekannt ist?
Conchylicultor

@Conchylicultor Nachteile Ihres Vorschlags: 1. Globale Suche nach type2. dann Aufrufen 3. Nachschlagen des Typs von None- Wann Noneist sowohl ein Singleton als auch ein Schlüsselwort. Ein weiterer Nachteil: 4. Dies ist sehr ungewöhnlich und zieht die Augenbrauen hoch, wenn Leute auf Ihren Code schauen. x is Noneist eine optimierte Prüfung. Ich würde vorschlagen x is None or isinstance(x, (str, bool, int))- aber ich würde auch vorschlagen, dass Sie mehr darüber nachdenken, was Sie tun, wenn Sie diese Art der Typprüfung auf Typen durchführen, die nicht viel gemeinsam haben ...
Aaron Hall

4

Ich bin mir nicht sicher, ob dies die Frage beantwortet. Aber ich weiß, dass ich eine Weile gebraucht habe, um das herauszufinden. Ich habe eine Website durchlaufen und plötzlich war der Name der Autoren nicht mehr da. Also brauchte ich eine Check-Anweisung.

if type(author) == type(None):
     my if body
else:
    my else body

Der Autor kann in diesem Fall eine beliebige Variable sein und Noneein beliebiger Typ, nach dem Sie suchen.


Da Nonees sich um ein Singleton handelt, typesollte es nicht zum Erkennen verwendet werden None- stattdessen sollten Sie tun, was in der akzeptierten Antwort steht, und is Noneoder verwenden is not None.
Aaron Hall

2

Python 2.7:

x = None
isinstance(x, type(None))

oder

isinstance(None, type(None))

==> Richtig


1
Da Sie keine Unterklasse haben können NoneTypeund da Nonees sich um ein Singleton handelt, isinstancesollte es nicht zum Erkennen verwendet werden None- stattdessen sollten Sie tun, was in der akzeptierten Antwort steht, und is Noneoder verwenden is not None.
Aaron Hall

Oh ok! Vielen Dank !
Pesko

0

Ich hoffe, dieses Beispiel ist hilfreich für Sie.)

print(type(None) # NoneType

Sie können also den Typ des Variablennamens überprüfen

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.