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

use*_*766 7 python type-hinting 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"

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

Mic*_*x2a 5

与其使用列表,不如使用元组。例如:

sample: List[Tuple[IO, List[str]]] = [
   (fileobject1, ['hello', 'world']),
   (fileobject2, ['something', 'else']),
]
Run Code Online (Sandbox Code Playgroud)

Mypy 假设列表是同构的:它们永远只包含一种类型。元组旨在包含异构数据:允许每个项目具有不同的类型。

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

  • 您愿意为“Mypy 假设列表是同质的”提供官方参考吗? (2认同)