代码之家  ›  专栏  ›  技术社区  ›  Tobias Hermann

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

  •  1
  • Tobias Hermann  · 技术社区  · 6 年前

    (这是对 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'] 任务?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Michael0x2a    6 年前

    是--使用“ 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 .

    此配置文件将不允许使用 Any 几乎从整个代码库,除了 validation 模块。(然后,我会特意为那个特定模块添加一些单元测试,以弥补被削弱的静态类型检查。)