您可以在元组或列表中混合类型。为什么不能在键入提示时指定?
>>> 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
答案 0 :(得分:5)
在类型理论中,列表是包含一种类型值的同构结构。因此,List
仅采用一种类型,并且列表中的每个元素都必须具有该类型。
但是,类型理论还提供求和类型,您可以将它们视为包装从某些固定类型集中选择的一个值的包装器。 typing.Union
支持求和类型。要指定列表是int
和str
值的混合,请使用
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类型,通常需要在任何下游函数中处理不同的可能类型。接受工会通常没有什么问题。