python - parameter - isinstance(foo, bar) vs tipo(foo) es bar
type python (4)
si estoy verificando que SIEMPRE ES UN OBJETO BASE, ¿qué es lo que realmente pierdo al hacer el tipo?
Bueno, es bueno que hayas dado la respuesta documentada completa en tu pregunta, ¡entonces tu respuesta es que no pierdes nada ! Las únicas ocasiones en que es necesario isinstance()
es cuando se verifica la herencia de una clase determinada en comparación con otra, como bien se ha dicho y se hace referencia. type()
solo se usará para verificar si una instancia es exactamente de un tipo base dado.
Una cuestión de semántica, de verdad.
Hasta hace poco, si tuviera que realizar alguna comprobación de tipo en una estructura, usaría type(obj) is list
et. Alabama. Sin embargo, desde que me isinstance(obj,list)
me he dado cuenta de que todos (y me refiero a TODOS ) utilizan en su lugar isinstance(obj,list)
. Parece que son sinónimos, y el timeit
revela una velocidad casi IDENTICA entre ellos.
def a(): return type(list()) is list
def b(): return isinstance(list(),list)
from timeit import timeit
timeit(a)
# 0.5239454597495582
timeit(b)
# 0.5021292075273176
De hecho, incluso están de acuerdo en que son sinónimos, con la excepción de que el type is
COMPARE_OP
from dis import dis
dis(a)
# 2 0 LOAD_GLOBAL 0 (type)
# 3 LOAD_GLOBAL 1 (list)
# 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
# 9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
# 12 LOAD_GLOBAL 1 (list)
# 15 COMPARE_OP 8 (is)
# 18 RETURN_VALUE
dis(b)
# 2 0 LOAD_GLOBAL 0 (isinstance)
# 3 LOAD_GLOBAL 1 (list)
# 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
# 9 LOAD_GLOBAL 1 (list)
# 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
# 15 RETURN_VALUE
Francamente, me resulta más legible decir if type(foo) is list:
que if isinstance(foo,list):
el primero es básicamente solo un pseudocódigo y el segundo llama a alguna función (que tengo que consultar cada vez que isinstance
instanceof
o instanceof
) con algunos argumentos. No parece un tipo de isinstance(a,b)
, y no hay una forma explícita de saber si isinstance(a,b)
está comprobando si b
es una instancia de a
o viceversa.
Entiendo de esta pregunta que usamos esta isinstance
porque es más agradable acerca de la herencia. type(ClassDerivedFromList) is list
fallará, mientras que isinstance(ClassDerivedFromList,list)
tendrá éxito. Pero si estoy marcando qué SIEMPRE debería ser un OBJETO BASE, ¿qué es lo que realmente pierdo al hacer el type is
?
Aparte del problema de la herencia, también pierde la capacidad de probar varios tipos al usar isinstance
. Por ejemplo:
def chk(typ):
if not isinstance(typ, (str, int)):
raise ValueError(''typ must be string or int'')
...
La respuesta a tu pregunta es:
No, dado que estás verificando una clase base definida, ya que pierdes la capacidad de probar las clases heredadas.
Y la IMO es más isinstance
de leer y en Python: la legibilidad cuenta.
PD: estoy obteniendo una diferencia significativa en los tiempos (en Python 3.3)
type: 0.5241982917936874
isinstance: 0.46066255811928847
Los documentos de Python para la función de tipo incorporada proporcionan una guía clara sobre la diferencia entre tipo (con un argumento) y la instancia.
Con un argumento, devuelve el tipo de un objeto. El valor de retorno es un objeto de tipo y generalmente el mismo objeto que devuelve un objeto. clase La función integrada isinstance () se recomienda para probar el tipo de un objeto, ya que toma en cuenta las subclases.
Para ilustrar, eche un vistazo a la jerarquía de herencia a continuación en el módulo diamante:
Luego eche un vistazo a la salida de la consola de Python a continuación, basada en el módulo diamante:
Según la documentación, es más versátil y puede abarcar una gama más amplia de escenarios. Con respecto a la pregunta original del OP, las características de rendimiento no se declararon como una razón válida para favorecer una sobre la otra. Tampoco era legibilidad.
Para una discusión más profunda, que incluye una explicación sobre (en palabras de quien responde) "por qué la verificación de la igualdad de tipos es una práctica aún peor en las versiones recientes de Python de lo que solía ser" , consulte esta answer altamente votada