Python: la función type()
La función type() es una función básica de Python para trabajar con tipos. Como parte de la implementación de Python, pertenece al núcleo del lenguaje.
¿Para qué sirve la función type() en Python?
La función type() se utiliza en Python con dos objetivos bastante diferentes:
- Determinar el tipo de un objeto
- Crear dinámicamente un nuevo tipo
Veamos primero el primer caso, que es mucho más útil en el uso cotidiano.
Determinar el tipo de un objeto con type()
Python es un leguaje de tipado dinámico. Esto significa que los tipos se determinan en tiempo de ejecución y están ligados a valores en lugar de a variables. Debido a esta característica, es necesario determinar el tipo de un objeto en tiempo de ejecución.
Llamamos a la función type() de Python y le pasamos un objeto como único parámetro. Como resultado obtenemos el tipo del objeto, por ejemplo int
o str
:
Si llamamos a la función type() en el REPL de Python, la representación textual contiene la palabra “class” en lugar de “type”:
Aunque al principio puede parecer confuso, tiene sentido. Python sigue el principio de “todo es un objeto”. En Python, el tipo de un objeto corresponde a su clase. Por lo tanto, llamar a la función type() es equivalente a acceder al atributo __class__
.
Crear un nuevo tipo con type()
Veamos ahora el segundo uso posible de la función type(). Si se llama con tres argumentos, la función nos permite crear dinámicamente un nuevo tipo:
En esta forma, la función type() de Python funciona de forma análoga a la palabra clave class
. El código Type = type(“Type”, bases, dict)
equivale aproximadamente a la siguiente definición de clase:
A continuación, te mostramos algunos ejemplos concretos del uso de la función type() de Python para crear nuevos tipos. Antes, sin embargo, te presentamos una descripción general de los argumentos:
name |
bases |
dict |
**kwds |
---|---|---|---|
Nombre del nuevo tipo como cadena de texto | Tupla con clases de base | Diccionario con los atributos de la nueva clase | Otros argumentos para la instalación de la metaclase |
Con Deploy Now de IONOS puedes implementar tu página web o aplicación a través de GitHub.
¿Cómo funciona la función type() de Python?
Cuando se utiliza la función type() para determinar el tipo de un objeto, el valor de retorno no es una cadena, sino un objeto independiente:
Veamos algunos ejemplos de valores de retorno de la función type() para objetos de tipos completamente diferentes:
Llamada a type() | Representación textual |
---|---|
type(None)
|
<class 'NoneType'>
|
type(True)
|
<class 'bool'>
|
type(42)
|
<class 'int'>
|
type('John')
|
<class 'str'>
|
type(('Walter', 'White'))
|
<class 'tuple'>
|
type(...)
|
<class 'ellipsis'>
|
Es posible que te preguntes cuál es el tipo del objeto devuelto por type(). Hagamos la prueba. Llamamos a la función type() de Python y le pasamos el valor de retorno de otra llamada a type():
Vemos que, además de la función type() incorporada en Python, existe el tipo type
con el mismo nombre. Este es el tipo de todos los demás tipos en Python, como mostramos en este ejemplo:
El tipo de cada tipo en Python es, de hecho, type
. Puede sonar confuso, y aún hay más: el tipo del objeto type
es también type
. Esto puede continuar indefinidamente:
Para aclarar la confusión, se necesita una comprensión más profunda del sistema de programación orientada a objetos de Python. El objeto incorporado type
de Python representa una metaclase. Una metaclase se comporta con una clase como una clase se comporta con un objeto. En otras palabras, una metaclase es una plantilla para una clase, mientras que una clase es una plantilla para un objeto:
Plantilla | Instancia |
---|---|
Clase | Objeto |
Metaclase | Clase |
Ejemplo: type
|
int , str etc.
|
Ejemplo:int
|
42 |
Ejemplo: str
|
“Walter White” |
¿Cómo se utiliza la función type() en Python?
Normalmente, la función type() de Python se utiliza para obtener el tipo de un objeto en tiempo de ejecución. Esto es útil porque Python es un lenguaje de tipado dinámico. En un lenguaje de tipado estático como Java, un tipo está ligado a una variable por declaración y no puede ser cambiado en tiempo de ejecución:
Por el contrario, las variables en Python son simplemente nombres que hacen referencia a valores tipados. En cualquier momento durante la ejecución del código, un nombre puede referirse a un valor con un tipo diferente. Para determinar el tipo de una variable Python en tiempo de ejecución, necesitamos la función type():
Comprobación del tipo de argumentos de una función en Python
Al definir una función, a menudo es necesario comprobar que los argumentos cumplen determinados criterios. Por ejemplo, un argumento solo puede encontrarse dentro de ciertos límites o solo se admiten argumentos de tipos adecuados. Así se evitan errores en tiempo de ejecución.
Veamos un ejemplo de uso de la función type(). Definimos una función que suma una lista de números. Para que funcione, necesitamos asegurarnos de que cada argumento es realmente un número. Utilizaremos type() dentro de una sentencia assert
:
Depuración en Python REPL con la función type()
Una de las ventajas de utilizar un lenguaje interpretado como Python es la ejecución interactiva de código en el REPL (Read Eval Print Loop). Este enfoque permite la creación rápida de prototipos y la depuración directa mediante la inspección de los objetos en memoria.
Imaginemos el siguiente escenario: nuestro código contiene una variable answer
que se supone que contiene un valor booleano. Descubrimos que el tipo no coincide con lo que esperábamos y utilizamos la función type() de Python para obtener el tipo real. Resulta que accidentalmente escribimos el valor booleano entre comillas. Es un error común, especialmente entre principiantes:
Creación dinámica de clases Python con la función type()
Como hemos visto, las clases Python pueden crearse dinámicamente, es decir, en tiempo de ejecución, con la función type(). Esto es útil, entre otras cosas, para las familias de clases, que mostramos con el ejemplo de las etiquetas HTML. En primer lugar, creamos una clase base tag
, cuyos objetos pueden representarse a sí mismos como código HTML:
A continuación, especializaremos la clase base mediante herencia para los tags específicos como <p>
o <h1>
. Para ello, llamamos a la función type() con tres argumentos:
-
Nombre de la nueva clase en forma de cadena.
-
Tupla con las clases base.
Python permite la herencia múltiple; para derivar de una sola clase, utilizamos la notación
(ClassName,)
. -
Dict con el nombre de la clase y opcionalmente otros elementos.
Los elementos pueden ser funciones.
A continuación, instanciamos una etiqueta p
y comprobamos que la representación funciona correctamente:
El mismo efecto puede conseguirse mediante la definición de clases análogas:
Como otro ejemplo, creamos clases para encabezados utilizando type(). Dado que la creación de las clases es dinámica, podemos generar las clases para los seis niveles de encabezado de una vez utilizando una list comprehension.
Como hemos demostrado, vale la pena utilizar la función type() para crear cómodamente múltiples subclases relacionadas. Mostraremos este enfoque con un ejemplo más complejo: definiendo clases para modelar cartas de naipes. Primero, definiremos una superclase Card
utilizando la palabra clave class
:
A continuación, creamos subclases para los cuatro palos de cartas utilizando type():
Ahora podemos instanciar cada carta individual sin problemas:
¿Qué límites tiene la función type()?
La función type() de Python es útil. Sin embargo, hay algunos usos en los que la función alcanza sus límites para resolverlos. Afortunadamente, Python ofrece enfoques adecuados para abordarlos. Veamos algunos de ellos.
Descomponer jerarquías de herencia con isinstance()
type() solo determina el tipo real de un objeto Python, pero ignora la jerarquía de herencia. Representamos el dilema resultante con nuestro ejemplo de naipes de la última sección. El tipo de un 7 de picas debería ser tanto “naipe” como “pica”. Sin embargo, esto no se puede determinar con type():
Para descomponer correctamente el polimorfismo subyacente, hacemos uso de la función isinstance()
.
Simplificar la detección de tipos de objetos en Python con match-case
Como hemos visto anteriormente, la función type() se utiliza a menudo para determinar el tipo de un objeto en tiempo de ejecución. Para distinguir varios tipos posibles entre sí, se puede utilizar una construcción if-elif-else
:
Desde la versión 3.10, sin embargo, Python introdujo la sentencia match-case
. Esta permite, entre otras cosas, reconocer tipos sin tener que llamar a la función type().
Dentro de un bloque case
se pueden utilizar funciones constructoras como int(obj)
o str(obj)
. El bloque coincide si el objeto tiene el tipo correspondiente:
Para iniciarte en el lenguaje, utiliza nuestro tutorial de Python y nuestro artículo sobre operadores de Python.