【发布时间】:2022-01-21 17:36:50
【问题描述】:
我有一个函数,它接受五个整数的列表或五个整数作为元组 (*argv)。
这是我的函数标题:
def __init__(self, *argv: Union[int, list]) -> None:
稍后在这个函数中,我检查这个元组的内容,看看它是一个列表还是五个单独的整数。
if type(argv[0]) == int:
self._l1 = [argv[0], argv[1], argv[2], argv[3], argv[4]]
else:
self._l1 = argv[0]
此时代码中的 l1 是一个列表。 self._l1 绝对是一个列表,它不再是一个 int,它是一个列表。
但是稍后在我的代码中运行此行时:
self._myvar = self._l1.count(1)
MyPy 向我返回了这个错误
赋值中的类型不兼容(表达式的类型为“Union[int, List[Any]]”,变量的类型为“List[Union[int, List[Any]]]”)
我输入错了吗,我需要输入什么?我尝试了很多不同的类型,并且不断出错。
据我所知,尽管我的输入是一个元组,其中包含一个整数列表或五个整数。我假设它类似于 Union[Tuple[List[int]], Tuple[int, ...]] 或只是 Union[List[int], int] 或 Union[List[int], Tuple[int, 。 ..]],或类似的东西,但这些都不适合我。
【问题讨论】:
-
我强烈建议更改您的班级,以便
self._l1始终是一个列表,即使它只包含一项。尝试让一个函数做许多不同的事情只会导致不必要的复杂性。 -
谢谢,但 self._l1 始终是一个列表,它是函数的参数,可以是整数元组或包含单个列表的元组。
-
请显示导致错误的输入行。不清楚问题是当你传递 5 个整数时,还是当你传递一个元组时。错误消息是一个线索:注意它讨论了
Union。您要确保_li变为List[int],不是仍然包含Union的类型。在设置_li的那4 行代码之后,添加执行print(type(self._li))的行。 -
这仍然使您的函数变得不必要地复杂化:始终获取一个列表,并让调用者在必要时负责创建该列表。
标签: python types mypy typing typechecking