Recentemente, notei algo interessante ao analisar a especificação gramatical do Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
O bloco opcional 'arrow' estava ausente no Python 2 e não consegui encontrar nenhuma informação sobre seu significado no Python 3. Acontece que este é o Python correto e é aceito pelo intérprete:
def f(x) -> 123:
return x
Eu pensei que isso poderia ser algum tipo de sintaxe de pré-condição, mas:
- Eu não posso testar
x
aqui, ainda está indefinido, - Não importa o que eu coloquei depois da seta (por exemplo
2 < 1
), ela não afeta o comportamento da função.
Alguém acostumado com essa sintaxe pode explicar isso?
.__annotations__
atributo.__annotations__
atributo é um dicionário. A chavereturn
é aquela usada para recuperar o valor após a seta.Estas são anotações de função cobertas no PEP 3107 . Especificamente,
->
marca a anotação da função de retorno.Exemplos:
As anotações são dicionários, para que você possa fazer isso:
Você também pode ter uma estrutura de dados python em vez de apenas uma string:
Ou, você pode usar atributos de função para validar os valores chamados:
Impressões
fonte
Como outras respostas indicaram, o
->
símbolo é usado como parte das anotações de função. Nas versões mais recentes do Python>= 3.5
, porém, ele tem um significado definido .O PEP 3107 - Anotações de Função descreveu a especificação, definindo as alterações gramaticais, a existência
func.__annotations__
na qual elas são armazenadas e o fato de seu caso de uso ainda estar aberto.No
3.5
entanto, em Python , o PEP 484 - Type Hints atribui um único significado a isso:->
é usado para indicar o tipo que a função retorna. Também parece que isso será aplicado em versões futuras, conforme descrito em E sobre os usos existentes das anotações :(Ênfase minha)
Na verdade, isso não foi implementado,
3.6
até onde posso dizer, para que possa ter problemas com versões futuras.De acordo com isso, o exemplo que você forneceu:
será proibido no futuro (e nas versões atuais serão confusas), ele precisará ser alterado para:
por isso para descrever de forma eficaz que os função
f
retorna um objecto do tipoint
.As anotações não são usadas de forma alguma pelo próprio Python, elas as preenchem e as ignoram. Cabe a bibliotecas de terceiros trabalhar com elas.
fonte
No código a seguir:
o
-> int
just diz quef()
retorna um número inteiro (mas não força a função a retornar um número inteiro). É chamado de anotação de retorno e pode ser acessado comof.__annotations__['return']
.O Python também suporta anotações de parâmetro:
: float
informa às pessoas que leem o programa (e algumas bibliotecas / programas de terceiros, por exemplo, pylint) quex
deve ser afloat
. É acessado comof.__annotations__['x']
e não tem nenhum significado por si só. Veja a documentação para mais informações:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
fonte
Isso significa o tipo de resultado que a função retorna, mas pode ser
None
.É difundido em bibliotecas modernas orientadas no Python 3.x.
Por exemplo, existe no código da biblioteca pandas-profiling em muitos lugares, por exemplo:
fonte
def function(arg)->123:
É simplesmente um tipo de retorno, número inteiro , neste caso, não importa qual número você escreve.
como Java :
Mas, para Python (como Jim Fasarakis Hilliard disse), o tipo de retorno é apenas uma dica , por isso é sugerido o retorno, mas permita de qualquer maneira retornar outro tipo como uma string.
fonte
Meu resumo:
O Simply
->
é apresentado para que os desenvolvedores especifiquem opcionalmente o tipo de retorno da função. Consulte a Proposta de aprimoramento do Python 3107Esta é uma indicação de como as coisas podem se desenvolver no futuro, à medida que o Python for adotado extensivamente - uma indicação para digitação forte - esta é minha observação pessoal.
Você também pode especificar tipos para argumentos. A especificação do tipo de retorno das funções e argumentos ajudará a reduzir erros lógicos e a aprimorar aprimoramentos de código.
Você pode ter expressões como tipo de retorno (para os níveis de função e parâmetro) e o resultado das expressões pode ser acessado através do atributo 'return' do objeto de anotações . as anotações ficarão vazias para o valor de expressão / retorno para funções inline lambda.
fonte