Tipos avanzados de Python¶
🌐 Traducción por IA y humanos
Esta traducción fue hecha por IA guiada por humanos. 🤝
Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖
Puedes mejorar esta traducción ayudándonos a guiar mejor al LLM de IA.
Aquí tienes algunas ideas adicionales que podrían ser útiles al trabajar con tipos de Python.
Usar Union u Optional¶
Si por alguna razón tu código no puede usar |, por ejemplo si no está en una anotación de tipos 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í va un Consejo desde mi punto de vista muy subjetivo:
- 🚨 Evita usar
Optional[SomeType] - En su lugar ✨ usa
Union[SomeType, None]✨.
Ambas 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.
Creo que Union[SomeType, None] es más explícito respecto a lo que significa.
Se trata solo de palabras y nombres. Pero esas palabras pueden afectar cómo tú y tu 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 a la función sin el parámetro:
say_hi() # ¡Oh, no, esto lanza un error! 😱
El parámetro name sigue siendo requerido (no es opcional) porque no tiene un valor por defecto. Aun así, name acepta None como valor:
say_hi(name=None) # Esto funciona, None es válido 🎉
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. 😎