¿Cómo "probar" NoneType en Python?

398

Tengo un método que a veces devuelve un valor NoneType. Entonces, ¿cómo puedo cuestionar una variable que es NoneType? Necesito usar el método if , por ejemplo

if not new:
    new = '#'

Sé que es el camino equivocado y espero que entiendas lo que quise decir.

CrveniZg
fuente
Creo que esto fue respondido aquí y, aparentemente, en alguna parte antes
yorodm
Si Nonees el único valor que devuelve su método para el cual bool(returnValue)es igual False, entonces if not new:debería funcionar bien. Esto ocurre a veces en las re.matchbibliotecas incorporadas; por ejemplo, devuelve Ninguno o un objeto de coincidencia real.
Kevin
También vea mi respuesta sobre nully Noneen python aquí .
Michael Ekoka

Respuestas:

632

Entonces, ¿cómo puedo cuestionar una variable que es NoneType?

Usar isoperador, como este

if variable is None:

¿Por qué esto funciona?

Dado que Nonees el único objeto singleton de NoneTypePython, podemos usar el isoperador para verificar si una variable tiene Noneo no.

Citando de isdocumentos ,

Los operadores isy la is notprueba de identidad del objeto: x is yes verdadero si y solo si xy yson el mismo objeto. x is not yproduce el valor de verdad inverso.

Como solo puede haber una instancia de None, issería la forma preferida de verificar None.


Escucharlo de la boca del caballo

Citando las Directrices de estilo de codificación de Python - PEP-008 (definidas conjuntamente por el propio Guido),

Las comparaciones con singletons como Nonesiempre deben hacerse con isois not , nunca con los operadores de igualdad .

thefourtheye
fuente
Entonces, ¿cuál es la diferencia entre == Noney is None?
NoName
@NoName Con respecto a None, ambos arrojarán resultados similares.
thefourtheye
2
esto no funciona si se compara si pandasexiste un DataFrame; para eso, type(df) is type(None)The truth value of a DataFrame is ambiguous
solía
74
if variable is None:
   ...

if variable is not None:
   ...
elhoucine
fuente
27

También se puede hacer isinstancesegún la respuesta de Alex Hall :

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

isinstance también es intuitivo pero existe la complicación de que requiere la línea

NoneType = type(None)

que no es necesario para tipos como inty float.

cardamomo
fuente
Como no puede subclasificar NoneTypey Nonees un singleton, isinstanceno debe usarse para detectar None, sino que debe hacer lo que dice la respuesta aceptada, y usar is Noneo is not None.
Aaron Hall
18

Como lo señala el comentario de Aaron Hall:

Como no puede subclasificar NoneTypey Nonees un singleton, isinstanceno debe usarse para detectar None, sino que debe hacer lo que dice la respuesta aceptada, y usar is Noneo is not None.


Respuesta original

Sin embargo, la forma más simple, sin la línea adicional además de la respuesta del cardamomo es:
isinstance(x, type(None))

Entonces, ¿cómo puedo cuestionar una variable que es NoneType? Necesito usar si método

El uso isinstance()no requiere un isdentro de la ifdeclaración:

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

Información adicional
También puede verificar si hay varios tipos en una isinstance()declaración como se menciona en la documentación . Simplemente escriba los tipos como una tupla.

isinstance(x, (type(None), bytes))
Martin Müsli
fuente
1
Como no puede subclasificar NoneTypey Nonees un singleton, isinstanceno debe usarse para detectar None, sino que debe hacer lo que dice la respuesta aceptada, y usar is Noneo is not None.
Aaron Hall
1
Esta respuesta fue útil parapython 3.6.7
Santhosh Dhaipule Chandrakanth
@AaronHall ¿Por isinstance qué no se debe usar? Entiendo que isdebería preferirse, pero hay algunos casos en los que el formulario isinstance se siente más natural (como verificar múltiples tipos a la vez isinstance(x, (str, bool, int, type(None)))). ¿Es solo una preferencia personal o hay una advertencia que desconozco?
Conchylicultor
@Conchylicultor tiene inconvenientes para su sugerencia: 1. búsqueda global para type2. luego llamarla 3. luego buscar el tipo de None- cuando Nonees tanto un singleton como una palabra clave. Otro inconveniente: 4. esto no es muy estándar y levantará las cejas cuando las personas estén mirando su código. x is NoneEs un cheque más optimizado. Sugeriría x is None or isinstance(x, (str, bool, int)), pero también sugeriría que pienses más en lo que estás haciendo cuando estás haciendo ese tipo de verificación de tipos que no tienen mucho en común ...
Aaron Hall
4

No estoy seguro si esto responde la pregunta. Pero sé que esto me llevó un tiempo darme cuenta. Estaba recorriendo un sitio web y de repente el nombre de los autores ya no estaba allí. Así que necesitaba una declaración de verificación.

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

El autor puede ser cualquier variable en este caso, y Nonepuede ser cualquier tipo que esté buscando.

Joshua Pachner
fuente
Dado que Nonees un singleton, typeno debe usarse para detectar None, sino que debe hacer lo que dice la respuesta aceptada, y usar is Noneo is not None.
Aaron Hall
2

Python 2.7:

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

o

isinstance(None, type(None))

==> Verdadero

Pesko
fuente
1
Como no puede subclasificar NoneTypey Nonees un singleton, isinstanceno debe usarse para detectar None, sino que debe hacer lo que dice la respuesta aceptada, y usar is Noneo is not None.
Aaron Hall
Oh ok! Gracias !
Pesko
0

Espero que este ejemplo te sea útil)

print(type(None) # NoneType

Entonces, puede verificar el tipo del nombre de la variable

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
alexmosk25
fuente