¿Cómo puedo especificar el tipo de función en mis sugerencias de tipo?
¿ Cómo puedo especificar la sugerencia de tipo de una variable como tipo de función ? No hay typing.Function
y no pude encontrar nada en el PEP correspondiente, PEP 483 .
Como señaló @jonrsharpe en un comentario, esto se puede hacer con typing.Callable
:
from typing import Callable
def my_function(func: Callable):
Nota: Callable
por sí solo equivale a Callable[..., Any]
. Este tipo Callable
toma cualquier número y tipo de argumentos ( ...
) y devuelve un valor de cualquier tipo ( Any
). Si esto no tiene restricciones, también se pueden especificar los tipos de la lista de argumentos de entrada y el tipo de retorno.
Por ejemplo, dado:
def sum(a: int, b: int) -> int: return a+b
La anotación correspondiente es:
Callable[[int, int], int]
Es decir, los parámetros están subíndices en la suscripción externa con el tipo de retorno como 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 la función incorporada type()
para obtener el tipo de función incorporada y usarla. Entonces podrías tener
def f(my_function: type(abs)) -> int:
return my_function(100)
O algo de esa forma
Mi caso de uso específico para querer esta funcionalidad era habilitar la finalización de código enriquecido en PyCharm. El uso Callable
no hizo que PyCharm sugiriera que el objeto tenía un .__code__
atributo, que es lo que quería, en este caso.
Me topé con el types
módulo y...
from types import FunctionType
me permitió anotar un objeto FunctionType
y, listo, PyCharm ahora sugiere que mi objeto tiene un .__code__
atributo.
El OP no tenía claro por qué este tipo de sugerencia les resultó útil. Callable ciertamente funciona para cualquier cosa que se implemente, .__call__()
pero para mayor aclaración de la interfaz, envío el types
módulo.
Es una lástima que Python necesitara dos módulos muy similares.