我怎样才能注释f(* params)?

时间:2018-01-18 14:19:41

标签: python python-3.x python-3.6 typing argument-unpacking

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

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 个答案:

答案 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)