Как указать тип функции в подсказках типа?

Я хочу использовать подсказки типа в моем текущем проекте Python 3.5. Моя функция должна принимать функцию как параметр.

Как я могу указать функцию типа в подсказках типа?

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

Я проверил PEP 483, но не смог найти подсказку типа функции.

Ответы

Ответ 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]

Ответ 2

Еще один интересный момент заключается в том, что вы можете использовать встроенный type() функции type() чтобы получить тип встроенной функции и использовать ее. Таким образом, вы могли бы

def f(my_function: type(abs)) -> int:
    return my_function(100)

Или что-то в этой форме