Как я могу аннотировать f(*params)?
Я не могу понять, как правильно комментировать этот код:
from typing import Iterable
def f(*params: Iterable) -> str:
return ":".join(params)
я знаю это Iterable
неверно, потому что mypy говорит мне:
error: Argument 1 to "join" of "str" has incompatible type Tuple[Iterable[Any], ...]; expected Iterable[str]
... но я не понимаю почему.
1 ответ
Решение
Когда аннотации объединяются с *args
-стиль списков аргументов, аннотация указывает тип каждого ожидаемого аргумента. Как указано в PEP 484:
Списки произвольных аргументов также могут быть аннотированы типом, так что определение:
def foo(*args: str, **kwds: int): ...
является приемлемым, и это означает, что, например, все следующие представляют вызовы функций с допустимыми типами аргументов:
foo('a', 'b', 'c') foo(x=1, y=2) foo('', z=0)
В теле функции
foo
тип переменнойargs
выводится какTuple[str, ...]
и тип переменнойkwds
являетсяDict[str, int]
,
В вашем примере, так как params
как ожидается, будет кортеж строк, правильная аннотация str
:
def f(*params: str) -> str:
return ":".join(params)