Las anotaciones de tipo permiten indicar el tipo esperado de los parámetros de entrada y del valor de retorno de una función. Aunque Python no obliga a seguir estas anotaciones, su uso mejora la legibilidad del código y facilita la detección de errores con herramientas externas.
¿Qué son las anotaciones?
Las anotaciones son una característica del lenguaje que permite agregar metadatos (información adicional) a los parámetros y al valor de retorno de una función.
No cambian cómo se ejecuta la función. Solo sirven para describir o documentar lo que se espera que reciba y retorne. Estas anotaciones pueden ser usadas por herramientas externas (como editores o analizadores de tipo), pero Python en sí no las aplica ni verifica automáticamente.
¿De dónde vienen?
- PEP 3107: introdujo las anotaciones en Python 3 como una forma general de adjuntar metadatos a funciones, sin imponer ningún significado.
- PEP 484: definió un estándar para usar estas anotaciones específicamente para especificar tipos de datos, y dio origen al sistema de tipos estáticos en Python.
Un ejemplo básico:
def suma(a: int, b: int) -> int:
return a + b
Este código indica que:
- a y b deben ser enteros (
int
). - La función debe retornar un entero (
int
).
A pesar de estas anotaciones, Python no verifica los tipos en tiempo de ejecución:
print(suma("hola", "mundo")) # Resultado: "holamundo"
Esto ocurre porque Python utiliza tipado dinámico y sigue el principio de duck typing ("si camina como un pato...").
Accediendo a las anotaciones:
Podemos ver las anotaciones de una función con el atributo especial
__annotations__
:
def saludar(nombre: str) -> None:
print(f"Hola, {nombre}")
print(saludar.__annotations__)
Combinación con valores por defecto:
También es posible combinar las anotaciones con valores por defecto:
def agregar_elemento(lista: list[str] = []) -> list[str]:
lista.append("elemento")
return lista
No se recomienda usar listas mutables como valor por defecto. En su lugar, se puede usar None
y crear la lista dentro de la función.
Tipado estático con mypy:
Para reforzar las anotaciones, podemos usar herramientas de verificación estática de tipos como mypy
. Esta herramienta analiza el código sin ejecutarlo y detecta incoherencias de tipo.
1. Instalación:
pip install mypy
2. Código correcto:
def resta(a: int, b: int) -> int:
return a - b
print(resta(10, 3)) # Correcto
3. Código con error de tipos:
print(resta("hola", 5)) # Error detectado por mypy
4. Comprobación con mypy:
mypy archivo.py
Ejemplos de tipos comunes:
Tipo | Significado |
---|---|
int | Número entero |
float | Número decimal |
str | Cadena de texto |
bool | Booleano (True o False) |
list[int] | Lista de enteros |
dict[str, int] | Diccionario de cadenas a enteros |
Para usar tipos más avanzados (como listas tipadas), se recomienda importar los tipos desde el módulo typing
:
from typing import List, Dict
¿Por qué usar anotaciones?
Aunque no son obligatorias, las anotaciones:
- Mejoran la comprensión del código.
- Facilitan el mantenimiento.
- Permiten detectar errores antes de que ocurran.
- Ayudan al autocompletado en editores modernos (VSCode, PyCharm).