Подсказки типов переменных 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 и castTypeIs / TypeGuard / overload) - это скорее утверждения, поскольку они сообщают mypy то, что иначе mypy не мог бы предположить.

Вернуться на верх