Подсказки типов переменных mypy - это утверждения или объявления?
Я очень запутался в том, что на самом деле делают подсказки типа переменной в python (использую mypy). Насколько я понимаю, они полезны для подтверждения того, что правая часть присваивания действительно имеет тот же тип, что и подсказка типа в левой части. Но похоже, что есть еще и компонент декларации.
Я изучаю эту функцию. Когда я запускаю mypy, я получаю следующую ошибку:
def get_organization_from_query_params(query_params: QueryDict) -> Organization:
organization_id = query_params.get("organization_id")
organization = get_object_or_404(Organization.objects.active(), pk=organization_id)
return organization
mypy --strict --follow-imports=silent сообщает: error: Возврат Any из функции, объявленной для возврата "Organization" [no-any-return]
Однако, когда я добавляю подсказки типа для организации, изменяя строку на organization: Organization = get_object_or_404(Organization.objects.active(), pk=organization_id)
, mypy работает без проблем.
В этом случае mypy просто автоматически считает, что с этого момента organization
имеет тип Organization
? Как он может считать, что это верно, если раньше mypy думал, что get_object_or_404
возвращает объект типа Any
, но я никак не изменил функциональность, и теперь он верит в то, что get_object_or_404
возвращает объект типа Organization
? Является
Ошибки с кодом no-any-return
(генерируемым --warn-return-any
, который включен в --strict
) несколько педантичны. Я довольно часто отключаю этот параметр конфигурации.
может Any
быть возвращено значение неправильного типа (которое затем может посеять хаос в других частях вашей программы). В исходном коде вы никак не можете определить, что это именно так! Код не изменился бы, если бы get_object_or_404
возвращала статически известный тип вместо Any
.
Добавляя явную аннотацию переменной (или, что еще лучше, assert), mypy заставляет разработчика (а с assert - и среду выполнения) подтверждать правильность типов.
Чтобы ответить более узко, аннотации переменных - это объявления. Если mypy видит способ привести типы в соответствие с декларациями, он это сделает (при этом преимущество отдается постепенным формам вроде Any
). Использование assert
и cast
(и TypeIs
/ TypeGuard
/ overload
) - это скорее утверждения, поскольку они сообщают mypy то, что иначе mypy не мог бы предположить.