python-3.x 为什么List不能包含多个类型?

gzjq41n4  于 2023-02-06  发布在  Python
关注(0)|答案(3)|浏览(128)

你可以在元组或列表中混合类型,为什么不能在输入提示中指定呢?

>>> from typing import Tuple, List
>>> t = ('a', 1)
>>> l = ['a', 1]

>>> t2: Tuple[str, int] = ('a', 1)
>>> l2: List[str, int] = ['a', 1]

TypeError: Too many parameters for typing.List; actual 2, expected 1
cwtwac6a

cwtwac6a1#

在类型论中,列表是包含一种类型的值的同构结构,因此List只接受一种类型,并且列表中的每个元素都必须具有该类型。
但是,类型论还提供了求和类型,您可以将其视为从某个固定类型集中选择的一个值的 Package 器。typing.Union支持求和类型。若要指定列表是intstr值的混合,请使用

List[Union[str, int]]

作为类型提示。
相比之下,元组是 * 产品类型 * 的示例,该类型由固定的类型集组成,并且其值是值的集合,每个值来自产品类型中的每个类型。Tuple[int,int,int]Tuple[str,int]Tuple[int,str]都是不同的类型,通过产品中的类型的 * 数目 * 以及它们出现的顺序来区分。

0g0grzrc

0g0grzrc2#

您 * 可以 * 使用Union,但一般来说,如果可以避免使用,列表应该是同构的而不是异构的:

from typing import List, Union
lst: List[Union[str, int]] = [1, 'a']

myp,至少,会很好地接受这个。
这意味着你的列表访问器将返回一个Union类型,通常需要在任何下游函数中处理不同的可能类型。

cbwuti44

cbwuti443#

使用ListUnion的答案在某些情况下是可行的,但是容易引起bug,并且不是最佳实践。List不允许多个类型是有原因的。让我来解释一下。

方式不正确

不正确的做法(就像其他一些答案写的那样)是这样的。

from typing import Union, List
List[Union[str, int]]

有两个问题。
1.不能多次重复键入
1.更新或更改列表时,类型提示可能会变得不准确。
虽然它可能会在短期内解决这个问题,但在python中使用类型提示并不是正确的方法。

正确方法1:齐性列表

这就是你使用列表的地方。列表是可变的,所以如果你添加了类型,然后改变了列表,那么类型就不再准确了。因此,你不应该对不同的类型使用List

from typing import List
my_list = List[str]

正确方法2:非同质元组

如果你真的需要在列表中输入hint,那么请使用Tuple。元组是不可变的,因此你可以确定元组中的类型是正确的。

from typing import Tuple
my_list = Tuple[str, int, int, str, int]

相关问题