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