Python中的静态类型检查工具
我正在处理一个很大的现有Python代码库,想开始添加类型注解,这样我就能进行一些静态检查。我想要的效果类似于Erlang、Strongtalk,或者Typed Scheme/Racket。
我见过一些简单粗暴的装饰器,它们根据函数的参数和返回类型注解来插入动态检查,但我想要的是更稳健的工具,能够在编译时进行检查。
现在有什么工具可以做到这一点呢?我对编译器和类型检查有一定了解,也愿意改进一个基础不错但不完整的工具。
(注意:我不想讨论静态类型的优缺点。)
编辑:举个例子:
def put(d, k, v):
d[k] = v
我希望能够将put
函数注解为类型put<K,V>(dict<K,V>, K, V) -> None
。
更新:新的PEP 484(2014年9月)为Python 3.5及以上版本定义了静态类型和类型注解的标准。有一个叫做mypy的类型检查工具,兼容PEP 484。
7 个回答
看看这个帖子:PySonar:一个用于Python的静态分析工具。PySonar是一个工具,它通过对代码进行抽象解释(也就是部分执行代码)来推断变量的类型。它会找到你程序中所有可能的执行路径,并找出所有变量可能的类型。
基本上,PySonar有三个版本:
- 开源的Java版本(Jython索引器)
- 闭源的Java版本(隐藏在谷歌里)
- 开源的Python版本(mini-pysonar)
除了闭源的那个,其他版本都没有完全实现。但基本的想法是,你可以把它作为你工作的基础。
你可能会觉得 mypy 很有意思。它已经被 Guido 提议加入 Python 3.5 了。
编辑于2016-11-11: 现在只需要使用 mypy。你可以逐步添加类型提示。在Python 3的源代码中,它会验证标准的 PEP 484 类型提示。即使在Python 2中,也可以通过特殊注释来表达类型。 Guido也喜欢这个。
这篇文章最初写于很久以前,那时候mypy还不存在。我保留了文章的原始内容,尽管现在看起来不太准确。
原始内容:
你可能想看看在这篇 关于Python静态分析的相关StackOverflow帖子中提到的一些项目。
总结一下:
由于Python广泛使用 鸭子类型,在其他语言中可能被称为“类型错误”的问题,在Python中可能会变成“对象 X 不支持方法 Y”。
编辑于2011-05-17:
我同意delnan的看法,静态类型在Python中似乎是不可能的 [显然是错误的]。但既然我们的怀疑似乎没有让你退缩,我只能给你更多关于这个主题的信息。我提供:
- 关于 Python的类型推断 的讨论。(其他链接来自这里。)
- Guido van Rossum关于添加可选静态类型的文章:第一部分 和 第二部分。
- RPython,这是Python的一个子集,可能有机会被静态分析到足以进行某种形式的类型检查。