为什么列表不能包含多种类型?

时间:2018-11-28 19:11:34

标签: python python-3.x type-hinting typehints

您可以在元组或列表中混合类型。为什么不能在键入提示时指定?

>>> 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

2 个答案:

答案 0 :(得分:5)

在类型理论中,列表是包含一种类型值的同构结构。因此,List仅采用一种类型,并且列表中的每个元素都必须具有该类型。

但是,类型理论还提供求和类型,您可以将它们视为包装从某些固定类型集中选择的一个值的包装器。 typing.Union支持求和类型。要指定列表是intstr值的混合,请使用

List[Union[str, int]]

作为类型提示。

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

答案 1 :(得分:2)

可以使用Union,但是通常,如果可以避免使用,列表应该是同质的,而不是异质的:

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

myp至少会接受这一点。

这意味着尽管您的列表访问器将返回Union类型,通常需要在任何下游函数中处理不同的可能类型。接受工会通常没有什么问题。

相关问题