Как я могу аннотировать 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)
Другие вопросы по тегам