Ответ 1
Как отметил @jonrsharpe в комментарии, это можно сделать с помощью typing.Callable
:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
Проблема: Callable
on it own переводится на Callable[..., Any]
что означает:
Вызываемый принимает любое количество/тип аргументов и возвращает значение любого типа. В большинстве случаев это не то, что вы хотите, так как вы разрешите почти любую функцию, которая будет передана. Вы хотите, чтобы также были намечены параметры функции и типы возвращаемых значений.
Вот почему многие types
typing
были перегружены для поддержки суб-скриптов, которые обозначают эти дополнительные типы. Итак, если, например, у вас была функция sum
которая принимает два int
и возвращает int
:
def sum(a: int, b: int) -> int: return a+b
Ваша аннотация для этого будет:
Callable[[int, int], int]
то есть параметры подпишутся во внешней подписке с типом возврата в качестве второго элемента во внешней подписке. В целом:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]