2016-06-15 2 views
18

Я хочу использовать подсказки типа в моем текущем проекте 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, но не мог найти тип функции подсказки там.

+8

функция является [ 'Callable'] (https://www.python.org/dev/peps/pep-0483/#fundamental- строительные блоки) – jonrsharpe

+1

https://www.python.org/dev/peps/pep-0483/#fundamental-building-blocks, последняя маркерная точка перед «мы могли бы добавить». – Evert

+1

О, замечательно :) Спасибо! Пожалуйста, напишите короткую запись - я собираюсь подтвердить ответ. – Jon

ответ

18

Как @jonrsharpe отмечено в комментарии, это может быть сделано с typing.Callable:

from typing import AnyStr, Callable 

def my_function(name: AnyStr, func: Callable) -> None: 

Проблема в том, Callable по себе переводится на Callable[..., Any], что означает:

отзывной принимает любое количество/type и возвращает значение любого типа. В большинстве случаев это не то, что вы хотите, так как вы разрешите почти любую функцию, которая будет передана. Вы хотите, чтобы также были намечены параметры функции и типы возвращаемых значений.

Именно поэтому многие types в typing были перегружены для поддержки суб-скриптинга, который обозначает эти дополнительные типы. Так что если, например, вы имели функцию sum, которая принимает два int с и возвращает int:

def sum(a: int, b: int) -> int: return a+b 

аннотацию к нему будет:

Callable[[int, int], int] 

то есть параметры суб- сценарий во внешней подписке с возвращаемым типом в качестве второго элемента во внешней подписке. В общем:

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType] 
0

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

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

или что-то, что формы

Смежные вопросы