Почему, когда mypy нуждается в аннотации типа, глупая аннотация имеет дело с ошибкой? - PullRequest
0 голосов
/ 28 февраля 2019

Mypy пишет об ошибке в этой строке:

response = {'available_fields': []}

error: Need type annotation for 'response'

Когда я добавляю глупую аннотацию, что ответ является диктом, ошибка исчезает:

response: typing.Dict = {'available_fields': []}

Итак, у меня есть несколько вопросов оЭто.Почему глупая аннотация имеет дело с ошибкой?Как настроить mypy (конфиги, опции и т. Д.), Чтобы не беспокоиться об этой строке без аннотации?

1 Ответ

0 голосов
/ 01 марта 2019

Проблема в том, что mypy понятия не имеет, что должен содержать ваш список.Это список строк?Список целых?Что-то еще?

Когда вы делаете что-то вроде ...

response: Dict = {'foo': []}

... mypy автоматически заполнит параметры отсутствующего типа для dict с Any, динамическимтип .Итак, вышеприведенное объявление в точности эквивалентно выполнению:

response: Dict[Any, Any] = {'foo': []}

То есть, ваш ключ может быть буквально любым (не просто строкой), а значение также может быть любым (не просто списком).


В вашем случае вам, вероятно, следует либо (a) указать ожидаемые ключи и типы значений в аннотации:

# For example:
response: Dict[str, List[str]] = {'foo': []}

... или (b) использовать TypedDict если ваш диктант более сложный.


Если вы хотите, чтобы mypy запретил вам пропускать параметры в универсальных типах (например, запрещаете делать просто response: Dict = ...), используйте --disallow-any-generics флаг командной строки .Вы также можете добавить эту опцию в файл конфигурации , если вы не хотите вводить флаг каждый раз, когда запускаете mypy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...