Cómo verificar el tipo de datos en Python (tipo vs isinstance)

Aprenda a verificar tipos de datos en Python. Comprenda cuándo usar type() frente a isinstance(), manejar clases personalizadas y escribir validaciones de verificación de tipos seguras.

Pruebe esta solución en el Editor

Descripción general

Python es un lenguaje de tipo dinámico, lo que significa que las variables pueden contener valores de cualquier tipo de datos y su tipo puede cambiar durante la ejecución. Si bien esta flexibilidad acelera el desarrollo inicial, también requiere que usted verifique los tipos de variables en tiempo de ejecución antes de ejecutar operaciones específicas de tipo, como realizar aritmética con números enteros o llamar a métodos de cadena.

Para verificar el tipo de datos de un objeto, Python proporciona dos funciones principales: `type()` e `isinstance()`. La función `type(obj)` devuelve el tipo de clase preciso del objeto. Si bien puedes usar `type(obj) == int` para verificar si un número es un número entero, este método generalmente no se recomienda porque no admite estructuras de herencia (una subclase de un número entero se evaluaría como `False`).

La forma pitónica recomendada para verificar los tipos es `isinstance(obj, class_info)`. Esta función comprueba si un objeto es una instancia de la clase especificada o cualquier subclase heredada de ella. También admite la verificación con una tupla de clases (por ejemplo, `isinstance(value, (int, float))`), lo que hace que el código de validación sea muy flexible y robusto.

Código y salida de ejecución

Este script demuestra la verificación de tipos de variables usando type() e isinstance(), mostrando las diferencias en la herencia.

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
Salida terminal
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

Implementación paso a paso

  • Utilice isinstance(variable, type_name) para la verificación de tipos general (conforme a la herencia).
  • Pase una tupla de tipos como isinstance(variable, (int, float)) para compararla con varias clases.
  • Utilice tipo(variable) es nombre_tipo solo cuando deba garantizar la coincidencia exacta de la clase, ignorando las subclases.

Preguntas frecuentes

¿Por qué se prefiere isinstance() a type()?

isinstance() admite la herencia de objetos y el polimorfismo. Si subclasifica un tipo integrado, isinstance() lo reconocerá correctamente como una instancia de la clase principal, mientras que type() se evaluará como False.

¿Cómo puedo comprobar si un objeto es invocable (como una función)?

Utilice la función callable() incorporada, que devuelve True si el objeto se puede invocar como una función.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.