python python-3.x python-3.5 type-hinting mypy

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