Anotações de Função: PEP-3107
Corri através de um trecho de código demonstrando as anotações de função do Python3. O conceito é simples, mas não consigo pensar por que eles foram implementados no Python3 ou se há bons usos para eles. Talvez o SO possa me esclarecer?
Como funciona:
def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
... function body ...
Tudo o que segue os dois pontos após um argumento é uma 'anotação' e as informações a seguir ->
são uma anotação para o valor de retorno da função.
foo.func_annotations retornaria um dicionário:
{'a': 'x',
'b': 11,
'c': list,
'return': 9}
Qual é o significado de ter isso disponível?
python
function
annotations
python-3.x
agscala
fonte
fonte
foo.func_annotations
estarfoo.__annotations__
em python3?def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
significaRespostas:
Eu acho que isso é realmente ótimo.
Vindo de uma formação acadêmica, posso dizer-lhe que as anotações provaram ser inestimáveis para permitir analisadores estáticos inteligentes para linguagens como Java. Por exemplo, você pode definir semânticas como restrições de estado, threads com permissão de acesso, limitações de arquitetura etc., e existem algumas ferramentas que podem lê-las e processá-las para fornecer garantias além do que você obtém dos compiladores. Você pode até escrever coisas que verifiquem pré-condições / pós-condições.
Sinto que algo como isso é especialmente necessário no Python por causa de sua digitação mais fraca, mas realmente não havia construções que tornassem isso simples e parte da sintaxe oficial.
Existem outros usos para anotações além da garantia. Eu posso ver como eu poderia aplicar minhas ferramentas baseadas em Java ao Python. Por exemplo, eu tenho uma ferramenta que permite atribuir avisos especiais aos métodos e fornece indicações quando você os chama para ler a documentação deles (por exemplo, imagine que você tem um método que não deve ser chamado com um valor negativo, mas é intuitivo do nome). Com anotações, eu poderia escrever algo assim para Python. Da mesma forma, uma ferramenta que organiza métodos em uma classe grande com base em tags pode ser escrita se houver uma sintaxe oficial.
fonte
As anotações de função são o que você faz delas.
Eles podem ser usados para documentação:
Eles podem ser usados para verificação de condição prévia:
Consulte também http://www.python.org/dev/peps/pep-0362/ para obter uma maneira de implementar a verificação de tipo.
fonte
Mass
eVelocity
em vez disso.def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second') -> float:
que mostrar o tipo de retorno. Esta é a minha resposta favorita aqui.return
anotação? Não parece aparecer em #locals
Essa é uma resposta bastante tardia, mas AFAICT, o melhor uso atual de anotações de função é PEP-0484 e MyPy .
Usado assim:
fonte
list(fib('a'))
com sua função de exemplo, o Python 3.7 aceita o argumento com satisfação e reclama que não há como comparar uma string e um int.Apenas para adicionar um exemplo específico de um bom uso da minha resposta aqui , juntamente com os decoradores, um mecanismo simples para vários métodos pode ser feito.
e um exemplo de uso:
Isso pode ser feito adicionando os tipos ao decorador, como mostra a postagem original de Guido , mas anotar os próprios parâmetros é melhor, pois evita a possibilidade de correspondência incorreta de parâmetros e tipos.
Nota : No Python, você pode acessar as anotações
function.__annotations__
e nãofunction.func_annotations
como ofunc_*
estilo foi removido no Python 3.fonte
function = self.typemap.get(types)
não funcionar quando subclasses estiverem envolvidas. Nesse caso, você provavelmente teria quetypemap
usar o loopisinnstance
. Pergunto-me se@overload
lida com isso corretamente__annotations__
é umdict
que não garante a ordem dos argumentos; portanto, esse fragmento às vezes falha. Eu recomendaria mudar otypes = tuple(...)
paraspec = inspect.getfullargspec(function)
entãotypes = tuple([spec.annotations[x] for x in spec.args])
.Uri já deu uma resposta adequada, então aqui está uma resposta menos séria: para que você possa reduzir seus textos.
fonte
A primeira vez que vi anotações, pensei "ótimo! Finalmente, posso optar por alguma verificação de tipo!" Obviamente, eu não havia notado que as anotações não são realmente aplicadas.
Decidi escrever um decorador de funções simples para aplicá-los :
Eu o adicionei à biblioteca Assegurar .
fonte
Há muito tempo que isso foi perguntado, mas o exemplo de trecho fornecido na pergunta é (como também foi mencionado) no PEP 3107 e no final desse exemplo de PEP também são fornecidos casos de uso que podem responder à pergunta do ponto de vista do PEP. Visão ;)
O seguinte é citado em PEP3107
Casos de Uso
No curso da discussão de anotações, vários casos de uso foram levantados. Alguns deles são apresentados aqui, agrupados por que tipo de informação eles transmitem. Também estão incluídos exemplos de produtos e pacotes existentes que podem fazer uso de anotações.
Consulte o PEP para obter mais informações sobre pontos específicos (bem como suas referências)
fonte
O Python 3.X (apenas) também generaliza a definição de função para permitir que argumentos e valores de retorno sejam anotados com valores de objetos para uso em extensões .
Seus dados META para explicar, para ser mais explícito sobre os valores da função.
As anotações são codificadas como
:value
após o nome do argumento e antes de um padrão e como->value
após a lista de argumentos.Eles são coletados em um
__annotations__
atributo da função, mas não são tratados como especiais pelo próprio Python:EXEMPLO:
O
typeannotations
módulo fornece um conjunto de ferramentas para verificação de tipo e inferência de tipo de código Python. Ele também fornece um conjunto de tipos úteis para anotar funções e objetos.Essas ferramentas são projetadas principalmente para serem usadas por analisadores estáticos, como linters, bibliotecas de conclusão de código e IDEs. Além disso, são fornecidos decoradores para fazer verificações em tempo de execução. A verificação do tipo em tempo de execução nem sempre é uma boa ideia no Python, mas em alguns casos pode ser muito útil.
https://github.com/ceronman/typeannotations
Como a digitação ajuda a escrever um código melhor
PEP 526 - Sintaxe para anotações variáveis
https://www.python.org/dev/peps/pep-0526/
https://www.attrs.org/en/stable/types.html
fonte
Apesar de todos os usos descritos aqui, o uso obrigatório e, muito provavelmente, obrigatório de anotações será para dicas de tipo .
Atualmente, isso não é imposto de nenhuma maneira, mas, a julgar pelo PEP 484, as versões futuras do Python permitirão apenas tipos como o valor para anotações.
Citação E os usos existentes de anotações? :
Embora eu não tenha visto nenhuma depreciação silenciosa na 3.6 ainda, isso pode muito bem ser aumentado para 3.7, em vez disso.
Portanto, mesmo que haja outros bons casos de uso, é melhor mantê-los apenas para obter dicas de tipo, se você não quiser mudar tudo em um futuro em que essa restrição esteja em vigor.
fonte
Como resposta um pouco atrasada, vários dos meus pacotes (marrow.script, WebCore etc.) usam anotações onde estão disponíveis para declarar tipecasting (ou seja, transformar valores recebidos da web, detectar quais argumentos são opções booleanas, etc.) para realizar marcação adicional de argumentos.
O Marrow Script cria uma interface completa da linha de comandos para funções e classes arbitrárias e permite definir documentação, conversão e valores padrão derivados de retorno de chamada por meio de anotações, com um decorador para suportar tempos de execução mais antigos. Todas as minhas bibliotecas que usam anotações suportam os formulários:
O suporte "bare" para funções de seqüência de caracteres ou conversão de texto permite uma mistura mais fácil com outras bibliotecas que reconhecem anotações. (Ou seja, temos um controlador da Web usando tipecasting que também é exposto como um script de linha de comando.)
Editado para adicionar: Eu também comecei a usar o pacote TypeGuard usando asserções de tempo de desenvolvimento para validação. Benefício: quando executadas com "otimizações" ativadas (
-O
/PYTHONOPTIMIZE
env var), as verificações, que podem ser caras (por exemplo, recursivas), são omitidas, com a idéia de que você testou corretamente seu aplicativo em desenvolvimento, para que as verificações sejam desnecessárias na produção.fonte
As anotações podem ser usadas para modularizar facilmente o código. Por exemplo, um módulo para um programa que eu estou mantendo poderia apenas definir um método como:
e poderíamos pedir ao usuário uma coisa chamada "param1", que é "Necessário para contar" e deve ser um "int". No final, podemos até converter a string fornecida pelo usuário no tipo desejado para obter a melhor experiência sem complicações.
Veja nosso objeto de metadados de função para obter uma classe de código aberto que ajuda com isso e pode recuperar automaticamente os valores necessários e convertê-los para qualquer tipo desejado (porque a anotação é um método de conversão). Até os IDEs mostram os preenchimentos automáticos corretos e assumem que os tipos estão de acordo com as anotações - um ajuste perfeito.
fonte
Se você olhar a lista de benefícios do Cython, um dos principais é a capacidade de dizer ao compilador que tipo de objeto Python é.
Posso imaginar um futuro em que o Cython (ou ferramentas semelhantes que compilam parte do seu código Python) usará a sintaxe da anotação para fazer sua mágica.
fonte
multiply
função a trabalhar apenas contra números inteiros, quando'na' * 8 + ' batman!'
é totalmente válido? ;)