Python es un lenguaje de tipado dinámico. A menudo de seguro habrás escuchado esto; pero, ¿qué significa? «Tipado» ni siquiera es una palabra válida en el español, sino una adaptación del inglés typing. Python también es un lenguaje de tipado fuerte. Este concepto no es tan frecuente como el primero, pero es asimismo muy relevante. Vamos a explicarlos.
Un lenguaje de programación tiene un sistema de tipos (esta es una mejor forma de ponerlo en español) dinámico cuando el tipo de dato de una variable puede cambiar en tiempo de ejecución. Python efectivamente es, entonces, un lenguaje de tipado dinámico, pues una variable puede comenzar teniendo un tipo de dato y cambiar en cualquier momento a otro tipo de dato. Por ejemplo:
a = 5 print(a) a = "Hola mundo" print(a)
Aquí la variable a
es creada con el valor 5
, que es un número entero (int
). Luego en la tercera línea se asigna el nuevo valor "Hola mundo"
, por lo cual el tipo de dato cambia a una cadena (str
). (No es estrictamente correcto hablar de variables en Python, véase Diferencia entre variables en Python y otros lenguajes). Podemos comprobar el cambio en la consola interactiva:
>>> a = 5 >>> type(a) <class 'int'> >>> a = "Hola mundo" >>> type(a) <class 'str'>
Si Python fuera un lenguaje de tipado estático, la segunda asignación de a
con una cadena debería arrojar un error, pues su tipo de dato es entero. Por ejemplo, en C:
int a = 5; a = "Hola mundo"; // ¡Error!
Pero aquí, además de comprobar que Python es un lenguaje de tipado dinámico, vemos otra característica: la inferencia de tipos. Al decir a = 5
o a = "Hola mundo"
, Python es capaz de inferir el tipo de dato de una variable a partir del valor que se le está asignando. La inferencia de tipos no es patrimonio exclusivo de lenguajes con tipado dinámico: C++, por ejemplo, es un lenguaje de tipado estático (igual que C) con la capacidad de inferir los tipos.
Por otro lado, un lenguaje es de tipado fuerte cuando, ante una operación entre dos tipos de datos incompatibles, arroja un error (durante la compilación o la ejecución, dependiendo de si se trata de un lenguaje compilado o interpretado) en lugar de convertir implícitamente alguno de los dos tipos. Python es un lenguaje de tipado fuerte. Por ejemplo:
a = 5 b = "7" print(a + b) # ¡Error!
Aquí la tercera línea arroja un error, porque un entero (a
) no puede sumarse a una cadena (b
). Python podría convertir automáticamente la variable b
a un entero o a
a una cadena para que la operación tenga éxito; pero no lo hace, porque el sistema de tipos es fuerte. Para realizar esta operación, hay que hacer alguna conversión explícita:
a = 5 b = "7" print(a + int(b))
Compárese con el mismo código de JavaScript, que es un lenguaje con tipado débil:
a = 5 b = "7" console.log(a + b) // Se ejecuta correctamente.
Aquí también a
y b
tienen tipos de dato diferentes, pero JavaScript convierte a
a una cadena para poder realizar la concatenación, porque su sistema de tipos es débil. Esto suele llamarse coerción de tipos. Así, el resultado es "57"
(una cadena).
Ahora bien, a pesar de ser un lenguaje de tipado dinámico, Python soporta opcionalmente un sistema de tipos estático. Usando anotaciones, podemos indicar el tipo de dato de una variable al crearla:
a: int = 5
Esta es sintaxis válida de Python. El hecho de que el tipado estático en Python sea opcional quiere decir que el intérprete por sí mismo no arrojará un error en tiempo de ejecución si la variable cambia su tipo de dato:
a: int = 5 print(a) a = "Hola mundo" # Esto no arroja ningún error durante la ejecución.
La forma de chequear que los tipos de dato de una variable no cambiarán durante la ejecución del programa es usando herramientas como mypy (desarrollada por Guido van Rossum, creador de Python, y colaboradores) o Pyre (desarrollada por Facebook). Así, si ejecutamos mypy sobre el código anterior (llamémosle tipos.py
), el resultado es el siguiente:
>mypy tipos.py
tipos.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")
Found 1 error in 1 file (checked 1 source file)
Vemos que la tercera línea arroja un error, porque se intenta asignar una cadena a una variable cuyo tipo de dato fue anotado como entero. De hecho, ni siquiera es necesario anotar el tipo de dato de a
. El siguiente código provoca el mismo error en mypy:
a = 5 print(a) a = "Hola mundo"
Esto ocurre porque mypy (igual que Python) infiere que el tipo de dato de a
es un entero, pues el primer valor que obtiene es 5
. Y si comienza siendo un entero, no puede cambiar luego a una cadena. Si realmente queremos permitir que una variable en nuestro código cambie su tipo de dato durante la ejecución, debemos anotarla como Any
:
from typing import Any a: Any = 5 print(a) a = "Hola mundo"
De esta manera el chequeo resulta exitoso:
>mypy tipos.py
Success: no issues found in 1 source file
En conclusión, Python es un lenguaje de tipado dinámico y fuerte, con la posibilidad de adquirir un sistema de tipado estático vía las anotaciones de tipos (como a: int = 5
o b: str = "Hola mundo"
) y herramientas de chequeo como mypy o Pyre. El gran beneficio de incluir tipado estático en Python radica en la capacidad de las herramientas de chequeo de detectar errores antes de la ejecución del programa, con el solo análisis del código.
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
Joe says:
¡Excelente!
Permitidme por favor unas pequeñas correcciones gramaticales …
«Seguro que a menudo …» en vez de «A menudo de seguro».
«en español» en vez de «en el español».
¡Saludos!
Recursos Python says:
Hola, Joe. Me alegra que te haya gustado. Con todo, lo que mencionás las considero más variaciones que errores gramaticales.
Saludos