No python 3.x, é comum usar a anotação de tipo de retorno de uma função, como:
def foo() -> str:
return "bar"
Qual é a anotação correta para o tipo "vazio"?
Estou considerando 3 opções:
def foo() -> None:
- não lógico IMO, porque
None
não é um tipo,
- não lógico IMO, porque
def foo() -> type(None):
- usando a melhor sintaxe que conheço para obter
NoneType
,
- usando a melhor sintaxe que conheço para obter
def foo():
- omitir informações de tipo de retorno explícito.
A opção 2. parece a mais lógica para mim, mas já vi alguns exemplos de 1.
python
annotations
void
type-hinting
Tregoreg
fonte
fonte
void
tipo de retorno. Qualquer função (ou ramificação em uma função) sem umreturn
retorno explícitoNone
. Presumo que o OP entenda isso, este comentário é principalmente para o benefício dos futuros leitores ...Respostas:
Isto é direto do PEP 484 - Documentação de dicas de tipo :
E, como você pode ver, a maioria dos exemplos usa
None
como tipo de retorno.fonte
NoReturn
é usado "... para anotar funções que nunca retornam normalmente. Por exemplo, uma função que incondicionalmente levanta uma exceção ..."TLDR: o equivalente idiomático de uma
void
anotação de tipo de retorno é-> None
.Isso corresponde a uma função sem
return
ou apenas umareturn
avaliaçãoNone
.Omitir o tipo de retorno não significa que não haja valor de retorno. Conforme PEP 484 :
Isso significa que o valor é considerado digitado dinamicamente e oferece suporte estático a qualquer operação . Esse é praticamente o significado oposto de
void
.A sugestão de tipo em Python não exige estritamente tipos reais. Por exemplo, as anotações podem usar cordas de nomes de tipo:
Union[str, int]
,Union[str, 'int']
,'Union[str, int]'
e diversas variantes são equivalentes.Da mesma forma, a anotação de tipo
None
é considerada como significando "é deNoneType
". Isso pode ser usado não apenas para tipos de retorno, embora você o veja com mais frequência lá:Isso também se aplica a tipos genéricos. Por exemplo, você pode usar
None
inGenerator[int, None, None]
para indicar que um gerador não recebe ou retorna valores.Embora o PEP 484 sugira esses
None
meiostype(None)
, você não deve usar a última forma explicitamente. A especificação de sugestão de tipo não inclui nenhuma forma detype(...)
. Esta é tecnicamente uma expressão de tempo de execução e seu suporte depende inteiramente do verificador de tipo. Omypy
projeto está considerando a possibilidade de remover o suporte paratype(None)
e remova-o 484 também.fonte