mypy: правильный способ аннотирования списка нескольких типов - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть список списков, каждый из которых содержит файловый объект и список строк:

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

Я набираю аннотированный sample, например:

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

Далее в моем коде я вызываю некоторые методы для первой (0) и второй (1) записи внутреннего списка.

Например, вот так, чтобы очистить самую внутреннююlist:

entry[1].clear()

Код работает нормально, но mypy справедливо жалуется на то, что:

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

Как бы я набрал аннотировать этоправильно?Может быть, использовать другую структуру данных все вместе?

1 Ответ

0 голосов
/ 28 сентября 2018

Вместо того, чтобы использовать списки, вы должны использовать кортежи.Например:

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

Mypy предполагает, что списки являются однородными: они будут содержать только один тип.Кортежи должны содержать разнородные данные: каждый элемент может иметь свой тип.

Обратите внимание, что кортежи - не единственные типы, которые вы можете использовать здесь - вы можете создавать и использовать пользовательский класс или использоватьNamedTuples ... Но переключение на кортежи, вероятно, было бы самым простым решением здесь.

...