如何注释可能有或可能没有不同类型的列表?

How to annotate a list that may or MAY NOT have different types?

python版本:3.10.2

据我了解,list[str|int] 应该允许三种不同类型的值:

  1. 仅字符串列表 (list[str])
  2. 只有整数的列表 (list[int])
  3. 字符串和整数列表 (list[str|int])

这个假设是对的,还是我理解错了?因为这不是我编码时发生的事情:

def test(x: list[str|int]):
    pass

# All fine
test([]); test(['a']); test([0]); test(['a', 0])

x: list[str] = []
y: list[int] = []
z: list[str|int] = []

test(x); test(y); test(z)

它接受仅包含字符串或整数的列表,但 如果我未指定所讨论的列表仅接受这些值之一。 xy 被显式声明为只接受 one 这个值(intstr)的列表,并且由于他们被拒绝了。这真的是应该发生的事情,还是一个错误?

如果我更改函数注释以接受 Sequence[str|int] 而不是 list[str|int],那么一切都很好。 Container[str|int] 甚至 tuple[str|int, ...] 也一样 [

这是问题所在:

类型检查器不知道也不关心 test 对列表做了什么。它只关心它可能对列表做什么。合法的一件事是将 str 添加到列表中:您说(参数)x 的类型为 list[str|int]。如果传递给 test 的列表具有 list[str|int]list[str] 类型,那很好;如果列表的类型为 list[int].

,则 可以

也就是说,test 不接受具有 strint 值的列表:它接受 必须 能够的列表包含 strint 值。

当您将参数类型更改为 Sequence[str|int] 时,问题就消失了,因为 Sequence 不允许更改。该类型保证如果您提供 list[int] 值,test 将不会尝试 添加 一个 str 到列表。