python-3.x - 如何让 mypy 提示将 Any 分配给 int(第 2 部分)

标签 python-3.x type-hinting mypy typechecking static-typing

(这是 this question 的后续行动。)

我的代码库是完全静态类型的(注解),但在某些时候有 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'] 赋值?

最佳答案

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

在这种情况下,我认为您希望专门使用 --disallow-any-expr,但我建议您也尝试使用其他标志。

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


顺便说一句,您可能会发现启用所有“不允许任何”标志最终会带来一些不便,尤其是当您的代码的某个区域需要执行大量运行时检查时。

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

[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

此配置文件将禁止在几乎整个代码库中使用Anyvalidation 模块除外。 (然后,我会竭尽全力为该特定模块添加一堆单元测试,以弥补削弱的静态类型检查。)

关于python-3.x - 如何让 mypy 提示将 Any 分配给 int(第 2 部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51696060/

相关文章:

python - 如何使用 pandas 根据行值条件更改列数据类型

python - 使用 tkinter 在 GUI 中创建一个 Box

python - pandas.DataFrame.replace,对于第一列

Python:未知类型提示不会因 __future__ import 引发异常

python - 如何注释多个返回值的类型?

python - Python中是否有 "Addable"协议(protocol)或抽象基类?如果不是,又该如何定义呢?

python - 添加类型信息而不依赖于输入模块

Python 随机正 bigint - sql 数据类型

python - 如何在 Python 中创建用户定义类型断言?

python - CompletedProcess 是 mypy 的泛型