是否可以在Python3.9.4中嵌套typing.Union?
from typing import Union
TestValue = Union[int, str, float]
TestArray = Union[list, tuple]
TestListA = tuple[str, TestValue]
TestListB = TestArray[str, TestValue, TestValue]在这段代码中,我在TestListB行中得到了一个异常:
File "C:\Python39\lib\typing.py", line 268, in inner
return func(*args, **kwds)
File "C:\Python39\lib\typing.py", line 751, in __getitem__
_check_generic(self, params, len(self.__parameters__))
File "C:\Python39\lib\typing.py", line 202, in _check_generic
raise TypeError(f"{cls} is not a generic class")
TypeError: typing.Union[list, tuple] is not a generic class我希望能够指定第一个条目是str的元组或列表,而其他两个条目是str、int或float。我的linter似乎很流行,但是Python本身却没有。
发布于 2021-05-25 18:40:37
不幸的是,你试图做的是无效的--你不能像你所说的那样“嵌套”工会。这是无效的输入语法。
此外,List类型将只接受一个参数--列表中所有项的类型(对于Sequence类型也是如此):
# This is valid
MyList = List[int]
# This will throw an exception:
MyList = List[int, str, str]这与Tuple非常不同,您可以在其中定义固定大小的元组中的每个项的类型。因此,将两者交替地混合在一起,或者拥有某种“超级类型”,从Python的角度看没有多大意义。
我不确定类型检查器是否知道如何检查列表中是否有确切的n项。
如果可以的话,我会一直使用元组(甚至命名为元组?)对于这样的代码--有固定数量的项目和特定类型的列表的整个想法有点违背直觉。
否则,TBH --我不确定输入是否有一个好的解决方案--我能想到的最接近的类型是:
ItemType = Union[str, int, float]
SequenceType = Union[List[ItemType], Tuple[str, ItemType, ItemType]]当然,这将允许用户传递任意长度的列表,其中包含str、int和float的任何混合项--但据我所知,您不能更严格地键入列表(也不应该)。
发布于 2021-05-25 18:30:27
好吧,正如我从您的代码中了解到的,您需要类似于Union[list[str, TestValue, TestValue], tuple[str, TestValue, TestValue]]的东西。但是你实际上是在做一些类似Union[list, tuple][str, TestValue, TestValue]的事情,这是不正确的。也许ListContent = Union[str, TestValue, TestValue]; TestArray = Union[list[ListContent], tuple[ListContent]]是一种解决方案
https://stackoverflow.com/questions/67693516
复制相似问题