Come "testare" NoneType in Python?


398

Ho un metodo che a volte restituisce un valore NoneType. Quindi, come posso mettere in discussione una variabile che è NoneType? Devo usare il metodo if , per esempio

if not new:
    new = '#'

So che è sbagliato e spero che tu capisca cosa intendevo dire.


Penso che sia stata data una risposta qui e apparentemente da qualche parte prima
yorodm,

Se Noneè l'unico valore restituito dal metodo per cui è bool(returnValue)uguale False, allora if not new:dovrebbe funzionare bene. Ciò si verifica a volte nelle librerie incorporate, ad esempio re.matchrestituisce None o un oggetto match veritiero.
Kevin,

Vedi anche la mia risposta su nulle Nonein Python qui .
Michael Ekoka,

Risposte:


632

Quindi, come posso mettere in discussione una variabile che è NoneType?

Usa l' isoperatore, in questo modo

if variable is None:

Perché questo funziona?

Poiché Noneè l'unico oggetto singleton di NoneTypein Python, possiamo usare l' isoperatore per verificare se una variabile ha Noneo meno dentro di essa.

Citando da isdocumenti ,

Gli operatori ise is nottest per l'identità dell'oggetto: x is yè vero se e solo se xe ysono lo stesso oggetto. x is not yproduce il valore della verità inversa.

Dal momento che può esserci solo un'istanza di None, issarebbe il modo preferito per verificare None.


Ascoltalo dalla bocca del cavallo

Citando le linee guida sullo stile di codifica di Python - PEP-008 (definito congiuntamente dallo stesso Guido),

I confronti con i singleton come Nonedovrebbero sempre essere fatti con isois not , mai , gli operatori di uguaglianza .


Quindi qual è la differenza tra == Nonee is None?
NoName

@NoName Rispetto a None, entrambi otterranno risultati simili.
theourourye

2
questo non funziona se si confronta se pandasesiste un DataFrame - per questo, io uso type(df) is type(None)per evitare:The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

Esso può essere fatto anche con isinstancecome da risposta di Alex Hall :

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

isinstance è anche intuitivo ma c'è la complicazione che richiede la linea

NoneType = type(None)

che non è necessario per tipi come inte float.


Poiché non è possibile eseguire la sottoclasse NoneTypee poiché Noneè un singleton, isinstancenon deve essere utilizzato per rilevare None, invece è necessario fare come dice la risposta accettata e utilizzare is Noneo is not None.
Aaron Hall

18

Come sottolineato dal commento di Aaron Hall:

Poiché non è possibile eseguire la sottoclasse NoneTypee poiché Noneè un singleton, isinstancenon deve essere utilizzato per rilevare None, invece è necessario fare come dice la risposta accettata e utilizzare is Noneo is not None.


Risposta originale:

Il modo più semplice, tuttavia, senza la riga aggiuntiva oltre alla risposta del cardamomo è probabilmente:
isinstance(x, type(None))

Quindi, come posso mettere in discussione una variabile che è NoneType? Devo usare il metodo if

L'uso isinstance()non richiede un isall'interno della ifdichiarazione:

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

Informazioni aggiuntive
È inoltre possibile verificare la presenza di più tipi in un'unica isinstance()istruzione, come indicato nella documentazione . Basta scrivere i tipi come una tupla.

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

1
Poiché non è possibile eseguire la sottoclasse NoneTypee poiché Noneè un singleton, isinstancenon deve essere utilizzato per rilevare None, invece è necessario fare come dice la risposta accettata e utilizzare is Noneo is not None.
Aaron Hall

1
Questa risposta è stata utile perpython 3.6.7
Santhosh Dhaipule Chandrakanth,

@AaronHall Perché isinstance non dovrebbe essere usato? Capisco che isdovrebbe essere preferito, ma ci sono alcuni casi in cui la forma isinstance sembra più naturale (come cercare più tipi contemporaneamente isinstance(x, (str, bool, int, type(None)))). È solo una preferenza personale o c'è un avvertimento di cui non sono a conoscenza?
Conchylicultor,

@Conchylicultor svantaggio del tuo suggerimento: 1. ricerca globale per type2. quindi chiamarlo 3. quindi cercare il tipo di None- quando Noneè sia un singleton che una parola chiave. Un altro aspetto negativo: 4. questo è molto non standard e solleverà le sopracciglia quando le persone guardano il tuo codice. x is Noneè un controllo più ottimizzato. Suggerirei x is None or isinstance(x, (str, bool, int))- ma suggerirei anche di pensare di più a quello che stai facendo quando fai quel tipo di verifica dei tipi per tipi che non hanno molto in comune ...
Aaron Hall

4

Non sono sicuro se questo risponde alla domanda. Ma so che mi ci è voluto un po 'per capire. Stavo navigando in un sito Web e all'improvviso il nome degli autori non c'era più. Quindi avevo bisogno di una dichiarazione di controllo.

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

L'autore può essere qualsiasi variabile in questo caso e Nonepuò essere qualsiasi tipo che si sta verificando.


Poiché Noneè un singleton, typenon dovrebbe essere usato per rilevare None- invece dovresti fare come dice la risposta accettata e usare is Noneo is not None.
Aaron Hall

2

Python 2.7:

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

o

isinstance(None, type(None))

==> Vero


1
Poiché non è possibile eseguire la sottoclasse NoneTypee poiché Noneè un singleton, isinstancenon deve essere utilizzato per rilevare None, invece è necessario fare come dice la risposta accettata e utilizzare is Noneo is not None.
Aaron Hall

Oh va bene! Grazie !
Pesko,

0

Spero che questo esempio ti sia stato utile)

print(type(None) # NoneType

Quindi, puoi controllare il tipo del nome della variabile

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.