modelos - predicciones python
Ninguno Error/error de Python? (4)
Puedes probar:
>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False
isinstance toma 2 argumentos isinstance(object, classinfo)
Aquí, al pasar None
, está configurando classinfo
en None, de ahí el error. Necesitas pasar en el tipo.
En Python tienes el Singleton None
, que actúa de manera bastante extraña en ciertas circunstancias:
>>> 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
En primer lugar, <type ''NoneType''>
muestra que None
no es un tipo, pero que NoneType
es. Sin embargo, cuando ejecuta isinstance(a,NoneType)
, responde con un error: NameError: name ''NoneType'' is not defined
Ahora, dado esto, si tiene una función con un valor predeterminado de entrada establecido en None
y necesita verificar, debería hacer lo siguiente:
if variable is None:
#do something
else:
#do something
¿Cuál es la razón por la que no puedo hacer lo siguiente?
if isinstance(variable,None): #or NoneType
#do something
else:
#do something
Solo busco una explicación detallada para poder entender mejor esto
Edición: buena aplicación
Digamos que quería usar isinstance
para poder hacer algo si la variable
es una variedad de tipos, incluido None
:
if isinstance(variable,(None,str,float)):
#do something
None
es solo un valor de types.NoneType
, no es un tipo.
Y el error es suficientemente claro:
TypeError: isinstance () arg 2 debe ser una clase , tipo o tupla de clases y tipos
De la docs :
None
es el único valor detypes.NoneType
.None
se usa con frecuencia para representar la ausencia de un valor, como cuando los argumentos predeterminados no se pasan a una función.
Puedes usar types.NoneType
>>> from types import NoneType
>>> isinstance(None, NoneType)
True
is
operador también funciona bien:
>>> a = None
>>> a is None
True
None
es un valor (instancia) y no un tipo. Como muestra el mensaje de error, isinstance
espera que el segundo argumento sea un tipo.
El tipo de Ninguno es type(None)
, o No se Nonetype
si lo importa ( from types import NoneType
)
Nota: la forma idiomática de hacer la prueba es variable is None
. Corto y descriptivo.
None
no es un tipo, es la instancia de singleton en sí, y el segundo argumento de isinstance
debe ser un tipo, una clase o una tupla de ellos. Por lo tanto, necesita utilizar NoneType
de types
.
from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
True True
Aunque, a menudo me inclino a reemplazar isinstance(x, (NoneType, str, float))
con x is None or isinstance(x, (str, float))
.