你可以在元组或列表中混合类型,为什么不能在输入提示中指定呢?
>>> 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
你可以在元组或列表中混合类型,为什么不能在输入提示中指定呢?
>>> 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
3条答案
按热度按时间cwtwac6a1#
在类型论中,列表是包含一种类型的值的同构结构,因此
List
只接受一种类型,并且列表中的每个元素都必须具有该类型。但是,类型论还提供了求和类型,您可以将其视为从某个固定类型集中选择的一个值的 Package 器。
typing.Union
支持求和类型。若要指定列表是int
和str
值的混合,请使用作为类型提示。
相比之下,元组是 * 产品类型 * 的示例,该类型由固定的类型集组成,并且其值是值的集合,每个值来自产品类型中的每个类型。
Tuple[int,int,int]
、Tuple[str,int]
和Tuple[int,str]
都是不同的类型,通过产品中的类型的 * 数目 * 以及它们出现的顺序来区分。0g0grzrc2#
您 * 可以 * 使用
Union
,但一般来说,如果可以避免使用,列表应该是同构的而不是异构的:myp
,至少,会很好地接受这个。这意味着你的列表访问器将返回一个Union类型,通常需要在任何下游函数中处理不同的可能类型。
cbwuti443#
使用
List
和Union
的答案在某些情况下是可行的,但是容易引起bug,并且不是最佳实践。List
不允许多个类型是有原因的。让我来解释一下。方式不正确
不正确的做法(就像其他一些答案写的那样)是这样的。
有两个问题。
1.不能多次重复键入
1.更新或更改列表时,类型提示可能会变得不准确。
虽然它可能会在短期内解决这个问题,但在python中使用类型提示并不是正确的方法。
正确方法1:齐性列表
这就是你使用列表的地方。列表是可变的,所以如果你添加了类型,然后改变了列表,那么类型就不再准确了。因此,你不应该对不同的类型使用
List
。正确方法2:非同质元组
如果你真的需要在列表中输入hint,那么请使用
Tuple
。元组是不可变的,因此你可以确定元组中的类型是正确的。