皇上,还记得我吗?我就是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()

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

新特性:警告 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()

查看文档以了解更多关于此项新特性的信息。

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

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

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

分享到:更多 ()