Cómo especificar múltiples tipos de retorno utilizando sugerencias de tipo

Tengo una función en python que puede devolver un bool o una list . ¿Hay una manera de especificar los tipos de retorno utilizando sugerencias de tipo.

Por ejemplo, ¿Es esta la forma correcta de hacerlo?

 def foo(id) -> list or bool: ... 

De la documentación

clase typing.Union

Tipo de union Unión [X, Y] significa X o Y.

Por lo tanto, la forma correcta de representar más de un tipo de datos de retorno es

 from typing import Union def foo(client_id: str) -> Union[list,bool] 

Pero tenga en cuenta que la escritura no se aplica. Python sigue siendo un lenguaje de tipo dynamic. La syntax de anotación se ha desarrollado para ayudar durante el desarrollo del código antes de su lanzamiento a producción. Como indica PEP 484, “no se realiza ninguna comprobación de tipo en tiempo de ejecución”.

 >>> def foo(a:str) -> list: ... return("Works") ... >>> foo(1) 'Works' 

Como puede ver, estoy pasando un valor int y devolviendo un str. Sin embargo, las __annotations__ se establecerán en los valores respectivos.

 >>> foo.__annotations__ {'return': , 'a': } 

Consulte PEP 483 para obtener más información sobre las sugerencias de tipo. Consulte también ¿Qué son las sugerencias de tipo en Python 3.5 ?

Tenga en cuenta que esto solo está disponible para Python 3.5 y versiones posteriores. Esto se menciona claramente en PEP 484 .

La statement def foo(client_id: str) -> list or bool: cuando se evalúa es equivalente a def foo(client_id: str) -> list: y, por lo tanto, no hará lo que desea.

La forma nativa de describir una sugerencia de tipo “A o B” es Unión (gracias a Bhargav Rao):

 def foo(client_id: str) -> Union[list, bool]: 

No quiero ser el chico de “¿Por qué quieres hacer esto de todos modos?”, Pero tal vez tener 2 tipos de devolución no es lo que quieres:

Si desea devolver un bool para indicar algún tipo de error especial, considere usar Excepciones en su lugar. Si desea devolver un bool como un valor especial, tal vez una lista vacía sería una buena representación. También puede indicar que None se puede devolver None con Optional[list]