Python: Что такое подпись ввода для печати?

#python #typing

Вопрос:

Какова подпись ввода для печати или аналогичной функции, которая принимает переменное число аргументов любого типа, если она определена как вызываемый параметр?

Конкретно, в чем заключается декларация output_function здесь?

 def f(x: str, output_function=print):
    output_function(x)
 

Обновление: уточнено как вызываемый параметр.

Комментарии:

1. *args: Any …?

Ответ №1:

От PEP 484

Списки произвольных аргументов также могут быть аннотированы по типу, чтобы определение:

 def foo(*args: str, **kwds: int): ...
 

является приемлемым, и это означает, что, например, все следующие представляют вызовы функций с допустимыми типами аргументов:

 foo('a', 'b', 'c')
foo(x=1, y=2)
foo('', z=0)
 

Так print было бы:

 from typing import Any, IO
def print(*args: Any, sep: str = ' ', 
          end: str = 'n', file: IO = sys.stdout, 
          flush: bool = False) -> None:
 

Я не думаю, что вы можете применить это к a Callable , хотя. Из документов для typing ,

Синтаксис для указания необязательных аргументов или ключевых слов отсутствует; такие типы функций редко используются в качестве типов обратного вызова. Callable[..., ReturnType] (буквальное многоточие) можно использовать для ввода подсказки вызываемого объекта, принимая любое количество аргументов и возвращая ReturnType

Комментарии:

1. Превосходно! Как насчет объявления в качестве вызываемого параметра? Я обновил вопрос, чтобы уточнить, что это то, что я искал.

2. у Майпи нет никаких претензий x: Callable[..., None] = print .

3. @MarkHarrison Насколько я видел, вы не можете явно указать это. docs.python.org/3/library/typing.html#typing. Вызываемый говорит: «Нет синтаксиса для указания необязательных аргументов или ключевых слов; такие типы функций редко используются в качестве типов обратного вызова. Callable[..., ReturnType] (буквальное многоточие) может использоваться для ввода подсказки вызываемого объекта, принимающего любое количество аргументов и возвращающего ReturnType »

4. Или используйте typing.Protocol с заказом __call__ .