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

How to annotate variadic parameters in Python using typing annotations?

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

示例:

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

是否有任何打字注释?

tl;博士

基本上 args 被视为同构元组,kwds 被视为字典。 您只需为每个元素值注释一个类型。

说明

解释来自 PEP-484 的 quote

In the body of function foo, the type of variable args is deduced as Tuple[str, ...] and the type of variable kwds is Dict[str, int].

因此无需将 args 注释为整个同构类型的元组,但可以将 Tuple[T, ...] 减少为仅键入 T.

关键字参数也是如此,因为它们推断为 Dict[str, T]

关于元组注释中的省略号

在 python 文档中,没有太多关于 ... a.k.a Ellipsis but PEP-484 does mention various usages of the ellipsis in typing annotations like for omitting some type annotations or default values but most interestingly there is a qoute 用法的信息:

Tuple, used by listing the element types, for example Tuple[int, int, str]. The empty tuple can be typed as Tuple[()]. Arbitrary-length homogeneous tuples can be expressed using one type and ellipsis, for example Tuple[int, ...]. (The ... here are part of the syntax, a literal ellipsis.)

因此,如果您省略星号以强制将参数作为单个元组传递,则您需要保留完整注释:

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

关于同构元组中的各种类型

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

MyArg = Union[int, str, bool]

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

如果每个参数都有一个 TheType 类型 - 按照 PEP-484:

中的指定对其进行注释
def foo(*args: TheType):
    ...

不要使用:def foo(*args: Tuple[TheType]):,因为指定 Tuple[TheType] 意味着它是一个单元素元组 - 有一个 TheType 元素,不是可变参数的目的。