皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Mypy 0.720 发布,默认使用新的语义分析器

mypy 是处于实验性阶段的 Python 静态类型检查器,旨在结合动态类型和静态类型的优点,将 Python 的表现力和便利性与强大的类型系统和编译时(compile-time)类型检查相结合,提供编译时的类型检查和高效地编译为原生代码,无需使用重量级和耗费 runtime 开销的 Python 虚拟机。

mypy 仍处于开发阶段,支持大多数 Python 特性。

最新版本 0.720 已发布,更新内容主要是默认使用了新的语义分析器,以及针对语义分析器的许多改进。

默认使用新的语义分析器(Semantic Analyzer)

新的语义分析器在 mypy 0.710 版本被引入,现在成为默认选择。当然旧的语义分析器并没被移除,只需加上 –no-new-semantic-analyzer 参数即可使用。不过团队表示会在下一个版本中移除旧的语义分析器。

语义分析器是 mypy 的一个组件,用于将名称绑定到定义。它还会追踪每个名称定义的内容,例如函数或类型别名。新的语义分析器包含重大的重新设计,可以实现多种功能。

旧的语义分析器通常以线性顺序的方式处理文件,从开始到结束都是如此。这在 mypy 守护进程中略有不同,mypy 守护进程有时会将单个函数或模块顶层(代码未嵌套在函数中)作为单个单元进行处理。新的语义分析器通过在分析函数之前分别分析模块顶层来统一 mypy 行为。这样的好处是,可更密切地反映 Python runtime 的行为,因为模块通常在调用任何函数之前完全初始化。

旧的语义分析器按照复杂的启发法,以确定的顺序对导入周期中的每个模块进行两次处理。当存在尚未在依赖循环中处理的另一个模块的引用时,这可能导致出现虚报的错误。而新的分析器会以灵活的顺序处理模块,并且导入周期中的引用工作更加可靠。

另外,旧的语义分析器不能频繁处理定义的向前引用(forward references)。新的语义分析器改进了对向前引用的支持。例子:

    from typing import NamedTuple

    f = lambda: A(1)  # This forward reference now works
    
    A = NamedTuple('A', [('x', int)])
    
    f()

Mypy 0.720 发布,默认使用新的语义分析器Mypy 0.720 发布,默认使用新的语义分析器最后,新的语义分析器比旧的语义分析器更严格。它会捕获其他类型错误和质量问题。有关传递类型检查的现有代码可能需要进行小调整。

新特性:警告 Unreachable 代码

当加上 –warn-unreachable 参数运行 mypy 时,mypy 会对 unreachable 的语句进行警告,以及由于进行 short circuiting 操作而永远无法评估的表达式。如:

    from typing import Text
    
    def emphasize(text: Text) -> Text:
        if isinstance(text, int):
            text += 1  # Error: statement is unreachable
        return text.upper()

Mypy 0.720 发布,默认使用新的语义分析器Mypy 0.720 发布,默认使用新的语义分析器查看文档以了解更多关于此项新特性的信息。

除了上述的更新内容,还包括一些改进和 bug 修复,详情请查看发布主页

BTW:mypy 核心团队由其雇主 Dropbox 提供资金。

转自 https://www.oschina.net/news/108478/mypy-0720-released