如何让 mypy 抱怨将 Any 分配给 int(第 2 部分)

问题描述 投票:0回答:1

(这是这个问题的后续。)

我的代码库是完全静态类型的(注释),但在某些时候存在

Any
类型,例如因为值是从 JSON 字符串解析的。这是我的最小例子:

import json
from typing import Any, Dict, Union

def main() -> None:
    data = json.loads('{"value" = "three"}')
    my_int: int = data['value']

if __name__ == "__main__":
    main()

mypy --strict
接受此代码。不过我想自动找到这些地方,采取适当的安全措施。

有没有可能让

mypy
抱怨
my_int: int = data['value']
的作业?

python python-typing mypy
1个回答
7
投票

是——使用“disallow any”系列命令行标志。

在这种情况下,我认为您想专门使用

--disallow-any-expr
,尽管我建议您也尝试使用其他标志。

(这些标志不会作为

--strict
的一部分自动启用,因为它们最终会在某些代码库上导致大量误报,尤其是那些广泛使用非类型化库的代码库。)


顺便说一句,您可能会发现启用所有“禁止任何”标志最终可能会有点不方便,特别是当您的代码的某个区域需要进行大量运行时检查时。

为了帮助缓解这种情况,我个人喜欢做的是默认启用所有 disallow-any 标志,但对某些模块禁用其中一些标志。您可以使用 mypy 的 config 文件 来完成此操作。例如,您可以这样做:

[mypy]
# Specify any other global flags you want to customize here
disallow_any_unimported = True
disallow_any_expr = True
disallow_any_decorated = True
disallow_any_explicit = True
disallow_any_generics = True
disallow_subclassing_any = True

[mypy-mymodule.validation]
# Weaken, just for this module
disallow_any_expr = False

然后运行

mypy --strict --config my_config.ini mymodule

此配置文件将禁止在几乎整个代码库中使用

Any
,除了在
validation
模块内。 (然后,我会不遗余力地为该特定模块添加一堆单元测试,以弥补静态类型检查的弱化。)

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