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