mypy 变量类型提示 - 它们是断言还是声明?

问题描述 投票:0回答:1
我很困惑 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 报告:

错误:从声明返回“组织”的函数返回任何内容[无任何返回]

但是,当我通过将行更改为

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 的对象,那么它怎么能假设这是正确的呢?
?编写类型提示会同时触发断言和声明吗?

python django mypy python-typing
1个回答
0
投票
代码

no-any-return

 的错误(由 
--warn-return-any
 生成,包含在 
--strict
 中)有些迂腐。我经常禁用此配置选项。

这个想法是,在您的原始代码中,由于

Any

,您可能会返回错误类型的值(这可能会对程序中的其他地方造成严重破坏)。在您的原始代码中,您无法判断情况是这样!如果 
get_object_or_404
 返回静态已知类型而不是 
Any
,则代码将保持不变。

通过添加显式变量注释(或者更好的是断言),mypy 强制开发人员(或使用断言、运行时)确认类型是否正确。

更狭义地回答,变量注释是声明。如果 mypy 可以找到一种使类型与声明一致的方法,它就会(对像

Any

 这样的渐进形式给予怀疑)。使用 
assert
cast
 (以及 
TypeIs
 / 
TypeGuard
 / 
overload
)是更多断言,因为它们告诉 mypy 一些 mypy 不会假设的事情。

© www.soinside.com 2019 - 2024. All rights reserved.