Я хочу использовать подсказки типа в моем текущем проекте 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 , но не нашел там подсказки типа функции.
Callable
Ответы:
Как отметил @jonrsharpe в комментарии, это можно сделать с помощью
typing.Callable
:Проблема в том, что
Callable
она переведена на то,Callable[..., Any]
что означает:Вызываемый объект принимает любое количество аргументов / типа и возвращает значение любого типа. В большинстве случаев это не то, что вам нужно, поскольку вы разрешаете передавать практически любую функцию. Вы хотите, чтобы параметры функции и типы возвращаемых значений также были намеками.
Вот почему многие
types
изtyping
них были перегружены для поддержки подпрограмм, которые обозначают эти дополнительные типы. Итак, если, например, у вас есть функция,sum
которая принимает дваint
s и возвращаетint
:Ваша аннотация для него будет:
то есть параметры во внешней подписке записываются в подписку с типом возвращаемого значения в качестве второго элемента во внешней подписке. В основном:
источник
typing
материал поднимает весь язык Python на ступеньку выше.Callable[[Arg, Types, Here], ...]
для*args
,**kwargs
, ключевых слов только арга и позиционных только аргументов? Разве они не думали о соглашении о вызовах в сигнатурах типов для вызываемых объектов? ;)Еще один интересный момент, который следует отметить, заключается в том, что вы можете использовать встроенную функцию,
type()
чтобы получить тип встроенной функции и использовать его. Так что вы могли быИли что-то в этом роде
источник
builtin_function_or_method
какmy_function
? Неlambda
сработает? Пользовательская функция или связанный метод?