2016-09-03 2 views
3

Я хочу, чтобы моя функция была аннотирована, что она принимает другую функцию в качестве аргумента. Сначала мне показалось, что это будет работать нормально:Как правильно использовать функцию аннотации функции-аргумент

def my_function(func_argument: function): 
    pass 

однако функция не решено. Я просматривал встроенные функции, и это действительно не так, в отличие от str, int и других, которые я обычно использую. Тем не менее, это должно быть где-то, потому что:

>>> def my_function(): 
...  pass 
... 
>>> x = my_function 
>>> type(x) 
<class 'function'> 
>>> type(x).__name__ 
'function' 

Где определяется класс функций, почему он не встроен? Является ли моя первоначальная попытка правильной? На данный момент я пошел с аннотацией с types.FunctionType, но он не чувствует себя хорошо, потому что повсюду мы намекаем str не types.StringType. И импортировать типы только для одной аннотации также странно. typing библиотека также не имеет ничего такого, что помогло бы мне заменить это.

Кроме того, как бы FunctionType работу с типом аннотаций исполнившего библиотеки (я видел несколько из тех, кто летает)

ответ

1

Почему бы не использовать Callable:

Каркасы ожидающей функции обратного вызова определенных сигнатур может быть тип намекает использование Callable[[Arg1Type, Arg2Type], ReturnType]


from typing import Callable 

def my_function(func_argument: Callable[..., ReturnType]): # replace ReturnType with return type of func_argument 
    pass 
+0

Я пропустил Callable при наборе текста, но на самом деле это имеет смысл использовать, поскольку он работает как для лямбда, так и для функции. Мне не нравится, что он должен иметь тип возвращаемого значения, поскольку не все функции возвращают что-то - должны ли они тогда иметь None как второй аргумент? Кроме того, это не слишком понятно для кого-то, кто неопытен в наборе библиотеки, но я думаю, что это скорее проблема ввода, чем вопрос SO, спасибо :) – iScrE4m

+0

@ iScrE4m 'None' может использоваться для функций, которые * не возвращают ничего *, они фактически возвращаются 'None'. –

+0

Ну ладно, спасибо большое! – iScrE4m

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