Funciones

Anotaciones de tipo en funciones


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


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).