¿Cuál es la forma canónica de comprobar el tipo en Python?

¿Cuál es la mejor manera de comprobar si un objeto dado es de un tipo determinado? ¿Qué tal comprobar si el objeto hereda de un tipo determinado?

Digamos que tengo un objeto o. ¿Cómo puedo comprobar si es un str?

Solución

Para comprobar si o es una instancia de str o cualquier subclase de str, utilice isinstance (esta sería la forma "canónica"):

if isinstance(o, str):

Para comprobar si el tipo de o es exactamente str (excluyendo las subclases):

if type(o) is str:

Lo siguiente también funciona, y puede ser útil en algunos casos:

if issubclass(type(o), str):

Ver Funciones incorporadas en la Referencia de la Biblioteca Python para información relevante.

Una nota más: en este caso, si estás usando python 2, es posible que quieras usar:

if isinstance(o, basestring):

porque esto también atrapará cadenas Unicode (unicode no es una subclase de str; tanto str como unicode son subclases de basestring). Tenga en cuenta que basestring ya no existe en python 3, donde hay una separación estricta de cadenas (str) y datos binarios (bytes).

Alternativamente, isinstance acepta una tupla de clases. Esto devolverá True si x es una instancia de cualquier subclase de cualquiera de (str, unicode):

if isinstance(o, (str, unicode)):
Comentarios (6)

isinstance(o, str) devolverá True si o es un str o es de un tipo que hereda de str.

type(o) is str devolverá True si y sólo si o es un str. Devolverá False si o es de un tipo que hereda de str.

Comentarios (3)