Saltar al contenido

Tipos Avanzados de Python

Aquí hay algunas ideas adicionales que podrían ser útiles al trabajar con tipos de Python.

Usando Union o Optional

Si tu código por alguna razón no puede usar |, por ejemplo si no está en una anotación de tipo sino en algo como response_model=, en lugar de usar la barra vertical (|) puedes usar Union de typing.

Por ejemplo, podrías declarar que algo podría ser un str o None:

from typing import Union


def say_hi(name: Union[str, None]):
        print(f"Hi {name}!")

typing también tiene un atajo para declarar que algo podría ser None, con Optional.

Aquí hay un consejo desde mi punto de vista muy subjetivo:

  • 🚨 Evita usar Optional[SomeType]
  • En su lugar ✨ usa Union[SomeType, None] ✨.

Ambos son equivalentes y por debajo son lo mismo, pero recomendaría Union en lugar de Optional porque la palabra "optional" parecería implicar que el valor es opcional, y en realidad significa "puede ser None", incluso si no es opcional y sigue siendo requerido.

Pienso que Union[SomeType, None] es más explícito sobre lo que significa.

Se trata solo de las palabras y los nombres. Pero esas palabras pueden afectar cómo tú y tus compañeros de equipo piensan sobre el código.

Como ejemplo, tomemos esta función:

from typing import Optional


def say_hi(name: Optional[str]):
    print(f"Hey {name}!")

El parámetro name está definido como Optional[str], pero no es opcional, no puedes llamar la función sin el parámetro:

say_hi()  # Oh, no, this throws an error! 😱

El parámetro name es aún requerido (no opcional) porque no tiene un valor por defecto. Aún así, name acepta None como valor:

say_hi(name=None)  # This works, None is valid 🎉

La buena noticia es que, en la mayoría de los casos, podrás simplemente usar | para definir uniones de tipos:

def say_hi(name: str | None):
    print(f"Hey {name}!")

Así que, normalmente no tienes que preocuparte por nombres como Optional y Union. 😎