Python中的静态类型检查工具

42 投票
7 回答
19430 浏览
提问于 2025-04-16 17:46

我正在处理一个很大的现有Python代码库,想开始添加类型注解,这样我就能进行一些静态检查。我想要的效果类似于ErlangStrongtalk,或者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 个回答

6

看看这个帖子:PySonar:一个用于Python的静态分析工具。PySonar是一个工具,它通过对代码进行抽象解释(也就是部分执行代码)来推断变量的类型。它会找到你程序中所有可能的执行路径,并找出所有变量可能的类型。

基本上,PySonar有三个版本:

  • 开源的Java版本(Jython索引器)
  • 闭源的Java版本(隐藏在谷歌里)
  • 开源的Python版本(mini-pysonar

除了闭源的那个,其他版本都没有完全实现。但基本的想法是,你可以把它作为你工作的基础。

11

你可能会觉得 mypy 很有意思。它已经被 Guido 提议加入 Python 3.5 了。

17

编辑于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的一个子集,可能有机会被静态分析到足以进行某种形式的类型检查。

撰写回答