type parameter python typechecking

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