Lecciones del módulo (1/4)
Type hints: anotar tipos
Las indicaciones de tipo o type hints (anotaciones de tipo) son declaraciones opcionales que indican que "esta variable/parámetro tiene el tipo X". Python NO las verifica en tiempo de ejecución: son para ti, tu editor (¡autocompletado!) y herramientas como mypy o pyright que realizan una comprobación estática de tipos.
Anotar variables
nome: str = "Ada"
anni: int = 36
attivo: bool = True
prezzi: list[float] = [1.2, 3.4]La sintaxis es nombre: tipo = valor. Sin un valor, es una declaración pura:
risultato: int # nessuna assegnazione, solo "annuncio del tipo"Anotar funciones
def saluta(nome: str, urlante: bool = False) -> str:
s = f"Ciao {nome}"
return s.upper() if urlante else s
def somma(numeri: list[int]) -> int:
return sum(numeri)Sintaxis: param: tipo para cada parámetro, -> tipo para el retorno. Una función que no devuelve nada usa -> None.
Tipos genéricos integrados (Python 3.9+)
nomi: list[str] = ["a", "b"]
mappa: dict[str, int] = {"x": 1}
coppia: tuple[int, str] = (1, "ok")
unici: set[int] = {1, 2, 3}Optional y Union
Un valor que puede ser None:
def trova_utente(id: int) -> str | None:
if id == 1:
return "Ada"
return NoneX | None es la sintaxis moderna (Python 3.10+). Equivalente: Optional[X] de typing. Para uniones de múltiples tipos: int | str | float.
typing: herramientas útiles
from typing import Any, Callable
def applica(f: Callable[[int], int], x: int) -> int:
return f(x)
valore: Any = "qualunque cosa" # disabilita il checkAny= "no comprobar" (usar con moderación).Callable[[arg1, arg2], retorno]= una función que toma esos parámetros y devuelve ese tipo.
mypy: el comprobador de tipos
Instalas mypy, ejecutas mypy archivo.py y te dice si los tipos coinciden:
$ mypy script.py
script.py:5: error: Argument 1 to "somma" has incompatible type "str"; expected "int"Comprobación de tipos con mypy
El intérprete de Python no impone las indicaciones de tipo en tiempo de ejecución; se ignoran durante la ejecución. Para validar la corrección de los tipos, debes ejecutar una herramienta externa de análisis estático como mypy ejecutando el comando mypy script.py en tu terminal.
Pruébalo tú
Define una función `double(numbers: list[int]) -> list[int]` que devuelva una lista con cada elemento multiplicado por 2. Llámala con [1, 2, 3] y asígnala a `r`. Evalúa `r`.
Mostrar pista
Usa una comprensión de lista o un bucle for.
Solución disponible después de 3 intentos
Ejercicio de repaso
Define `first_or_none(items: list[int]) -> int | None` que devuelva el primer elemento si la lista no está vacía, de lo contrario None. Asigna `a = first_or_none([10, 20])` y `b = first_or_none([])`. Evalúa `(a, b)`.
Mostrar pista
`if items` es verdadero cuando la lista NO está vacía.
Solución disponible después de 3 intentos
Desafío adicional
Escribe una función `double_value(n: int) -> int` que tome un entero, lo multiplique por 2 y devuelva el resultado. Asegúrate de especificar las indicaciones de tipo tanto para el parámetro como para el valor de retorno. Finalmente, evalúa `double_value(5)`.
Mostrar pista
Usa n: int como parámetro y -> int después de la firma de la función.
Solución disponible después de 3 intentos