【问题标题】:How to make mypy complain about assigning an Any to an int (part 2)如何让 mypy 抱怨将 Any 分配给 int(第 2 部分)
【发布时间】:2019-01-12 17:31:54
【问题描述】:

(这是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'] 的分配?

【问题讨论】:

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


    【解决方案1】:

    是的——使用“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 模块除外。 (然后,我会不遗余力地为该特定模块添加一堆单元测试,以弥补弱化的静态类型检查。)

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2021-09-29
      • 2023-02-10
      • 2012-06-19
      • 1970-01-01
      • 2017-01-13
      • 2013-10-15
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多