#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__
.