Python中的静态类型检查工具

2024-05-23 18:05:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个大型的现有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兼容。


Tags: 工具代码类型put静态动态装饰函数参数
3条回答

你会发现mypy很有趣。一直是proposed for inclusion in Python 3.5 by Guido

编辑2016-11-11:只需使用mypy。类型提示可以逐渐添加。在Python 3源代码中,它验证标准的PEP 484类型提示。类型仍然可以使用特殊注释在Python 2中表示。Guido likes it

这篇文章最早是在mypy成为一个东西之前写的。我保留了这篇文章下面的原始内容,尽管它不太准确。


原帖:

您可能想查看本related StackOverflow post on static analysis for Python中提到的一些项目。

总而言之:

由于Python广泛地使用duck typing,在其他语言中可能被称为“类型错误”的东西最终可能是“objectX在Python中不支持methodY”。

编辑2011-05-17:

我同意delnan的观点,即Python不可能使用静态类型。但既然我们的怀疑似乎并没有吓倒你,我只能给你更多关于这个问题的信息。我出席:

  • 关于type inference for Python的讨论。(其他链接来自此处。)
  • Guido van Rossum关于添加可选静态类型的文章:part 1part 2
  • RPython,Python的一个子集,有可能被静态分析到足以进行某种形式的类型检查。

看看这篇文章:PySonar: a Static Analyzer for Python。PySonar是一个使用代码的抽象解释(部分执行)来推断类型的工具。它查找程序的所有可能执行路径,并查找所有变量的所有可能类型。

PySonar基本上有三种版本:

  • 开源Java(Jython索引器)
  • 封闭源Java(隐藏在Google中)
  • 开源Python(mini-pysonar

它们中的任何一个(除了封闭源代码一个)都没有完全实现。但基本的想法是你可以把它作为你工作的基础。

相关问题 更多 >