mypy:多种类型的类型注释列表的正确方法
mypy: Correct way of type-annotating list of multiple types
我有一个列表列表,每个列表都包含一个文件对象和一个字符串列表:
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"
我该如何正确输入注释?也许一起使用不同的数据结构?
与其使用列表,不如使用元组。例如:
sample: List[Tuple[IO, List[str]]] = [
(fileobject1, ['hello', 'world']),
(fileobject2, ['something', 'else']),
]
Mypy 假定列表是同类的:它们将只包含一种类型。元组旨在包含异构数据:允许每个项目具有不同的类型。
请注意,元组不是您可以在此处使用的唯一类型——您可以创建和使用自定义 class,或使用 NamedTuples...但切换到元组可能是此处最简单的解决方法.
我有一个列表列表,每个列表都包含一个文件对象和一个字符串列表:
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"
我该如何正确输入注释?也许一起使用不同的数据结构?
与其使用列表,不如使用元组。例如:
sample: List[Tuple[IO, List[str]]] = [
(fileobject1, ['hello', 'world']),
(fileobject2, ['something', 'else']),
]
Mypy 假定列表是同类的:它们将只包含一种类型。元组旨在包含异构数据:允许每个项目具有不同的类型。
请注意,元组不是您可以在此处使用的唯一类型——您可以创建和使用自定义 class,或使用 NamedTuples...但切换到元组可能是此处最简单的解决方法.