如何注释可能有或可能没有不同类型的列表?
How to annotate a list that may or MAY NOT have different types?
python版本:3.10.2
据我了解,list[str|int]
应该允许三种不同类型的值:
- 仅字符串列表 (
list[str]
)
- 只有整数的列表 (
list[int]
)
- 字符串和整数列表 (
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)
它接受仅包含字符串或整数的列表,但 仅 如果我未指定所讨论的列表仅接受这些值之一。 x
和 y
被显式声明为只接受 one 这个值(int
或 str
)的列表,并且由于他们被拒绝了。这真的是应该发生的事情,还是一个错误?
如果我更改函数注释以接受 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
不接受具有 str
或 int
值的列表:它接受 必须 能够的列表包含 str
或 int
值。
当您将参数类型更改为 Sequence[str|int]
时,问题就消失了,因为 Sequence
不允许更改。该类型保证如果您提供 list[int]
值,test
将不会尝试 添加 一个 str
到列表。
python版本:3.10.2
据我了解,list[str|int]
应该允许三种不同类型的值:
- 仅字符串列表 (
list[str]
) - 只有整数的列表 (
list[int]
) - 字符串和整数列表 (
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)
它接受仅包含字符串或整数的列表,但 仅 如果我未指定所讨论的列表仅接受这些值之一。 x
和 y
被显式声明为只接受 one 这个值(int
或 str
)的列表,并且由于他们被拒绝了。这真的是应该发生的事情,还是一个错误?
如果我更改函数注释以接受 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
不接受具有 str
或 int
值的列表:它接受 必须 能够的列表包含 str
或 int
值。
当您将参数类型更改为 Sequence[str|int]
时,问题就消失了,因为 Sequence
不允许更改。该类型保证如果您提供 list[int]
值,test
将不会尝试 添加 一个 str
到列表。