Eu quero usar dicas de tipo no meu projeto atual do Python 3.5. Minha função deve receber uma função como parâmetro.
Como posso especificar a função de tipo nas minhas dicas de tipo?
import typing
def my_function(name:typing.AnyStr, func: typing.Function) -> None:
# However, typing.Function does not exist.
# How can I specify the type function for the parameter `func`?
# do some processing
pass
Eu verifiquei o PEP 483 , mas não consegui encontrar uma dica de tipo de função lá.
Callable
Respostas:
Como @jonrsharpe observou em um comentário, isso pode ser feito com
typing.Callable
:O problema é que,
Callable
por si só, é traduzido para oCallable[..., Any]
que significa:Um chamador pega qualquer número de / tipo de argumentos e retorna um valor de qualquer tipo. Na maioria dos casos, isso não é o que você deseja, pois permitirá que praticamente qualquer função seja aprovada. Você deseja que os parâmetros de função e tipos de retorno também sejam sugeridos.
É por isso que muitos
types
detyping
ter sido sobrecarregado para suporte sub-scripting que denota estes tipos extras. Portanto, se, por exemplo, você tivesse uma funçãosum
que recebe dois seint
retorna umint
:Sua anotação seria:
ou seja, os parâmetros são subcriptografados na assinatura externa com o tipo de retorno como o segundo elemento na assinatura externa. Em geral:
fonte
typing
material move a linguagem python inteira um pouco mais.Callable[[Arg, Types, Here], ...]
a*args
,**kwargs
args somente com palavras-chave e args posicionais apenas? Eles não pensaram em chamar convenção nas assinaturas de tipo de chamadas? ;)Outro ponto interessante a ser observado é que você pode usar a função interna
type()
para obter o tipo de função interna e usá-la. Então você poderia terOu algo dessa forma
fonte
builtin_function_or_method
comomy_function
? Não seria umlambda
trabalho? Uma função definida pelo usuário ou método vinculado?