如何使用键入注释在Python中注释可变参数?

时间:2018-02-21 15:31:21

标签: python typing pep

如何注释可变参数函数的参数?

示例:

def foo(*args):  # Each arg expected to be of type T
    ...

是否有任何打字注释?

2 个答案:

答案 0 :(得分:2)

在python文档中,没有关于... aka Ellipsis的用法的详细信息,但PEP-484在输入注释时确实提到了省略号的各种用法,例如省略某些类型注释或默认值但最有趣的是有qoute说:

  

元组,用于列出元素类型,例如Tuple[int, int, str]。空元组可以输入为Tuple[()]。任意长度   同构元组可以用一种类型和省略号来表示   示例Tuple[int, ...]。 (...这里是语法的一部分,a   字面省略号。)

所以答案是:

def foo(*args: Tuple[T, ...]):
    ...

由于齐次元组意味着它的所有元素必须属于同一类型,因此如果您希望允许多种类型,只需使用Union或甚至使用类型别名以获得更好的可读性:

MyArg = Union[int, str, bool]

def foo(*args: Tuple[MyArg, ...]):
    ...

<强>更新

好像我错过了PEP-484中的另一个quote

  

在函数foo的主体中,变量args的类型推导为Tuple[str, ...],变量kwds的类型为Dict[str, int]

因此,您可以省略类型周围的Tuple[ ,...],然后:

MyArg = Union[int, str, bool]

def foo(*args: MyArg):
    ...

在语义上具有相同的含义。

答案 1 :(得分:0)

如果每个参数都有一个T类型,请按照PEP-484中的说明对其进行注释:

def foo(*args: T):
    ...

请勿使用: def foo(*args: Tuple[T]):