我无法弄清楚如何正确注释这段代码:
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]
......但我不明白为什么。
答案 0 :(得分:5)
当注释与*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)