Eu tenho uma função em python que pode retornar um bool
ou um list
. Existe uma maneira de especificar os tipos de retorno usando dicas de tipo.
Por exemplo, esta é a maneira correta de fazer isso?
def foo(id) -> list or bool:
...
Eu tenho uma função em python que pode retornar um bool
ou um list
. Existe uma maneira de especificar os tipos de retorno usando dicas de tipo.
Por exemplo, esta é a maneira correta de fazer isso?
def foo(id) -> list or bool:
...
Respostas:
A partir da documentação
classe
typing.Union
Tipo de união; União [X, Y] significa X ou Y.
Portanto, a maneira correta de representar mais de um tipo de dados de retorno é
from typing import Union
def foo(client_id: str) -> Union[list,bool]
Mas observe que a digitação não é imposta. O Python continua sendo uma linguagem de tipo dinâmico. A sintaxe da anotação foi desenvolvida para ajudar durante o desenvolvimento do código antes de ser liberado na produção. Como afirma o PEP 484, "nenhuma verificação de tipo acontece em tempo de execução".
>>> def foo(a:str) -> list:
... return("Works")
...
>>> foo(1)
'Works'
Como você pode ver, estou passando um valor int e retornando um str. No entanto, o valor __annotations__
será definido para os respectivos valores.
>>> foo.__annotations__
{'return': <class 'list'>, 'a': <class 'str'>}
Consulte o PEP 483 para obter mais informações sobre dicas de tipo. Consulte também O que são dicas de tipo no Python 3.5 ?
Observe que isso está disponível apenas para Python 3.5 e superior. Isso é mencionado claramente no PEP 484 .
A declaração, def foo(client_id: str) -> list or bool:
quando avaliada, é equivalente
def foo(client_id: str) -> list:
e, portanto, não fará o que você deseja.
A maneira nativa de descrever uma dica do tipo "A ou B" é Union (graças a Bhargav Rao):
def foo(client_id: str) -> Union[list, bool]:
Eu não quero ser o cara "Por que você quer fazer isso de qualquer maneira", mas talvez ter dois tipos de retorno não seja o que você deseja:
Se você deseja retornar um bool para indicar algum tipo de caso de erro especial, considere usar exceções. Se você deseja retornar um bool como algum valor especial, talvez uma lista vazia seja uma boa representação. Você também pode indicar que None
pode ser retornado comOptional[list]
Caso alguém tenha chegado aqui em busca de "como especificar tipos de vários valores de retorno?", Use Tuple[type_value1, ..., type_valueN]
from typing import Tuple
def f() -> Tuple[dict, str]:
a = {1: 2}
b = "hello"
return a, b
Mais informações: https://code-examples.net/en/q/2651e60