¿Cómo puedo especificar el tipo de función en mis sugerencias de tipo?

Resuelto Jon asked hace 8 años • 3 respuestas

¿ Cómo puedo especificar la sugerencia de tipo de una variable como tipo de función ? No hay typing.Functiony no pude encontrar nada en el PEP correspondiente, PEP 483 .

Jon avatar Jun 15 '16 19:06 Jon
Aceptado

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 Callabletoma 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

Hallsville3 avatar Oct 07 '2017 22:10 Hallsville3

Mi caso de uso específico para querer esta funcionalidad era habilitar la finalización de código enriquecido en PyCharm. El uso Callableno 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 typesmódulo y...

from types import FunctionType

me permitió anotar un objeto FunctionTypey, 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 typesmódulo.

Es una lástima que Python necesitara dos módulos muy similares.

John Carrell avatar Nov 29 '2021 18:11 John Carrell