¿Cuáles son las diferencias entre estos dos fragmentos de código?
Usando type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Usando isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
He aquí un ejemplo en el que isinstance
consigue algo que type
no puede:
class Vehicle:
pass
class Truck(Vehicle):
pass
en este caso, un objeto camión es un Vehículo, pero obtendrás esto:
isinstance(Vehicle(), Vehicle) # returns True
type(Vehicle()) == Vehicle # returns True
isinstance(Truck(), Vehicle) # returns True
type(Truck()) == Vehicle # returns False, and this probably won't be what you want.
En otras palabras, isinstance
también es cierto para las subclases.
Ver también: https://stackoverflow.com/q/707674/1341006
Es preferible esta última opción, ya que manejará correctamente las subclases. De hecho, tu ejemplo puede ser escrito incluso más fácilmente porque el segundo parámetro de isinstance()
puede ser una tupla:
if isinstance(b, (str, unicode)):
do_something_else()
o, usando la clase abstracta basestring
:
if isinstance(b, basestring):
do_something_else()
Según la documentación de python aquí hay una declaración:
8.15. tipos - Nombres para tipos incorporados
A partir de Python 2.2, las funciones funciones de fábrica como
int()
ystr()
también son nombres para los tipos correspondientes.
Así que isinstance()
debería preferirse a type()
.