3

我无法弄清楚如何正确注释此代码:

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]

……但我不明白为什么。

4

1 回答 1

6

当注释与*args-style 参数列表组合时,注释指定每个参数的类型 expected。如PEP 484所述:

任意参数列表也可以进行类型注释,以便定义:

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

是可以接受的,这意味着,例如,以下所有都表示具有有效参数类型的函数调用:

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

在函数体中fooargs推导出 变量Tuple[str, ...]的类型为 ,变量的类型kwdsDict[str, int]

在您的示例中,由于params预计是字符串元组,因此正确的注释是str

def f(*params: str) -> str:
    return ":".join(params)
于 2018-01-19T22:07:56.450 回答