Quiero usar sugerencias de tipo en mi proyecto actual de Python 3.5. Mi función debería recibir una función como parámetro.
¿Cómo puedo especificar la función de tipo en mis sugerencias 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
Revisé PEP 483 , pero no pude encontrar una pista de tipo de función allí.
Callable
Respuestas:
Como @jonrsharpe señaló en un comentario, esto se puede hacer con
typing.Callable
:El problema es que,
Callable
por sí solo, se traduce a loCallable[..., Any]
que significa:Un invocable toma cualquier número de argumentos / tipo y devuelve un valor de cualquier tipo. En la mayoría de los casos, esto no es lo que desea, ya que permitirá que se pase casi cualquier función. Desea que se insinúen también los parámetros de función y los tipos de retorno.
Es por eso que muchos
types
detyping
haber sido sobrecargado para el apoyo sub-secuencias de comandos que denota estos tipos adicionales. Entonces, si, por ejemplo, tuvo una funciónsum
que toma dosint
sy devuelve unint
:Su anotación para ello sería:
es decir, los parámetros se subescriben en la suscripción externa con el tipo de retorno como el segundo elemento en la suscripción externa. En general:
fuente
typing
mueve el lenguaje completo de Python a un nivel superior.Callable[[Arg, Types, Here], ...]
para*args
,**kwargs
, args palabra clave única y sólo argumentos posicionales? ¿No han pensado en llamar a la convención en las firmas de tipo para las llamadas? ;)Otro punto interesante a tener en cuenta es que puede usar la función integrada
type()
para obtener el tipo de función integrada y usarla. Entonces podrías tenerO algo de esa forma
fuente
builtin_function_or_method
comomy_function
? ¿No sería unlambda
trabajo? ¿Una función definida por el usuario o un método vinculado?