mypy:正确注释多个类型的列表的方法

时间:2018-09-27 19:45:38

标签: python typing mypy

我有一个列表列表,每个列表包含一个文件对象和一个字符串列表:

sample = [ [fileobject1, ['hello', 'world']], [fileobject2, ['something', 'else']] ]

我这样输入带注释的sample

List[List[Union[IO, List[str]]]]

在我的代码中,我在内部列表的第一个(0)和第二个(1)条目上调用一些方法。

例如,这样可以清除最内部的列表:

entry[1].clear()

代码运行正常,但是mypy正确地抱怨:

Item "IO[Any]" of "Union[IO[Any], List[str]]" has no attribute "clear"

如何正确键入注释?也许一起使用不同的数据结构?

1 个答案:

答案 0 :(得分:1)

您应该使用元组,而不是使用列表。例如:

sample: Tuple[IO, List[str]] = [
   (fileobject1, ['hello', 'world']),
   (fileobject2, ['something', 'else']),
]

Mypy假定列表是同类的:它们将永远只包含一种类型。元组应包含异构数据:每个项目都可以具有不同的类型。

请注意,元组不是您在这里可以使用的唯一类型,您可以创建和使用自定义类,也可以使用NamedTuples ...但是在这里切换到元组可能是最简单的解决方法。