我正在看这个功能。当我运行 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 报告:错误:从声明返回“组织”的函数返回任何内容[无任何返回]
但是,当我通过将行更改为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
,则代码将保持不变。通过添加显式变量注释(或者更好的是断言),mypy 强制开发人员(或使用断言、运行时)确认类型是否正确。
更狭义地回答,变量注释是声明。如果 mypy 可以找到一种使类型与声明一致的方法,它就会(对像
Any
这样的渐进形式给予怀疑)。使用
assert
和
cast
(以及
TypeIs
/
TypeGuard
/
overload
)是更多断言,因为它们告诉 mypy 一些 mypy 不会假设的事情。