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

问题描述 投票:0回答:1

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

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"

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

python python-typing mypy
1个回答
8
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.