Introducción a anotación y tipos en Python

Sintaxis de tipado

Anotación de variables

from typing import List

nombre: str = 'Pedro'
edad: int = 24
altura_mts: float = 1.7
colegas: List[str] = ['Jane', 'John']

Anotación en las funciones

from typing import Dict, List
import math

def calc_area_circulo(radio: float) -> float:
return math.pi*(radio**2)

def send_email(
subject: str,
body: str,
recipients: List[str],
cache: Dict[str, str]
) -> bool:

# ....
# Devuelve True o False el envío de un correo

return True

Usar tipos especiales

  • Any:
  • Literal:
  • Union
  • TypeDict
  • NoReturn
  • Final

Any

from typing import Any

resultado: Any = "Procesado"

resultado = 10

estatus: str = "Pendiente"

estatus = resultado

Literal

from typing import Literal


GENERO = Literal["hombre", "mujer", "no especificado"]

def crear_usuario(
nombre: str,
apellido: str,
genero: GENERO,
) -> Dict[str, str]:
return {
"nombre": nombre,
"apellido": apellido,
"genero": genero
}

crear_usuario("John", "Doe", "hombre")

{'nombre': 'John', 'apellido': 'Doe', 'genero': 'hombre'}

Union

from typing import Union


def get_temperatura() -> Union[int, float]:
return 20.8 # funciona también con 20.

TypedDict

from typing import TypedDict, Union


class Card(TypedDict):
rank: Union[str, int]
suit: str

# The Card class now has behaviours of both TypedDict and dict classes

# Card can be used to annotate a variable
ace_of_spade: Card = {'rank': 'A', 'suit': '♤'}

# or can be instantiated
ace_of_spade = Card(rank='A', suit='♤')

print(ace_of_spade)

{'rank': 'A', 'suit': '♤'}

NoReturn

from typing import NoReturn

def hola1() -> None:
print("Hola Mundo!")

def hola2() -> NoReturn:
print("Hola Mundo!")

Final

from typing import Final


MIN_NOMBRE_LONG: Final = 2

# mypy reporta error por que se le está asignando un nuevo valor a la
# variable
MIN_NOMBRE_LONG += 1


class Validador(object):
MIN_NOMBRE_LONG: Final[int] = 4

class UserValidador(Validador):
# El interprete marca una bandera en esta línea
MIN_NOMBRE_LONG = 3

Uso de verificadores de tipo

pip install mypy
#!/usr/bin/env python3

from typing import Literal, Dict


GENERO = Literal["hombre", "mujer", "no especificado"]


def crear_usuario(
nombre: str,
apellido: str,
genero: GENERO,
) -> Dict[str, str]:
return {
"nombre": nombre,
"apellido": apellido,
"genero": genero
}


crear_usuario("John", "Doe", "hombre")
crear_usuario("Jane", "Doe", "mujer")
crear_usuario("John", "Doe", "x")
mypy   pruebas_typing.py
content/code/pruebas_typing.py:23: error: Argument 3 to "crear_usuario" has incompatible type "Literal['x']"; expected "Union[Literal['hombre'], Literal['mujer'], Literal['no especificado']]"
Found 1 error in 1 file (checked 1 source file)

--

--

Senior Python Developer, Software Architect, Big Data, Data Science, Machine Learning and Deep Learning, Debian SysAdmin, DevOps, Blogger and Freelancer.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store