如何使用键入注释来注释 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
元素,不是可变参数的目的。
可变函数的参数如何注解?
示例:
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 isDict[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 asTuple[()]
. Arbitrary-length homogeneous tuples can be expressed using one type and ellipsis, for exampleTuple[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
元素,不是可变参数的目的。