python - ¿Cómo puedo especificar el tipo de función en mis sugerencias de tipo?
python-3.x python-3.5 (2)
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í.
Como
@jonrsharpe
señaló en un comentario, esto se puede hacer
typing.Callable
a
typing.Callable
.
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
El problema es que
Callable
por sí solo se traduce a
Callable[..., Any]
que significa:
Un invocable toma cualquier número de / tipo de argumentos 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
de
typing
se han sobrecargado para admitir sub-scripts que denotan estos tipos adicionales.
Entonces, si, por ejemplo, tuvo una
sum
función que toma dos
int
sy devuelve un
int
:
def sum(a: int, b: int) -> int: return a+b
Su anotación para ello sería:
Callable[[int, int], int]
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:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
Otro punto interesante a tener en cuenta es que puede usar el
type()
función incorporado
type()
para obtener el tipo de función incorporada y usarlo.
Entonces podrías tener
def f(my_function: type(abs)) -> int:
return my_function(100)
O algo de esa forma