用于Python中的静态类型检查的工具

Kan*_*dan 39 python static-typing

我正在使用大量现有的Python代码库,并希望开始添加类型注释,以便我可以进行一定程度的静态检查.我想象的是Erlang,StrongtalkTyped Scheme/Racket.

我见过快速和脏的装饰器,它们根据函数参数和返回类型注释插入动态检查,但我正在寻找更强大的东西并在编译时执行检查.

现在有哪些工具可用于此类事情?我熟悉编译器和类型检查,如果它具有良好的基础,我绝对愿意改进一个不完整的工具.

(注意:我对讨论静态类型的优缺点不感兴趣.)

编辑:一个例子:

def put(d, k, v):
   d[k] = v
Run Code Online (Sandbox Code Playgroud)

我希望能够将put函数注释为具有类型put<K,V>(dict<K,V>, K, V) -> None.

更新:新的PEP 484(2014年9月)定义了Python 3.5+中静态类型和类型注释的标准.有一个名为mypy的类型检查工具,它与PEP 484兼容.

Kar*_*tan 16

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

这篇文章最初写于mypy之前的很久以前.我保留了帖子的原始内容,尽管它不太准确.


原帖:

您可能想要查看有关Python静态分析的相关StackOverflow帖子中提到的一些项目.

综上所述:

由于Python 广泛使用duck typing,因此在其他语言中可能被称为"类型错误"的东西可能最终成为Python中的"对象X不支持方法Y ".

编辑2011-05-17:

我同意delnan的说法,Python不可能进行静态输入[显然是错误的].但由于我们的怀疑似乎并没有阻止你,我只能给你更多有关这个问题的信息.有请:


kir*_*sos 9

你可能会发现mypy很有趣.有人建议将包含在Guido的Python 3.5中.


Van*_*uan 6

看看这篇文章:PySonar:Python的静态分析器.PySonar是一种使用代码的抽象解释(部分执行)推断类型的工具.它找到程序的所有可能的执行路径,并查找所有可能的变量类型.

PySonar基本上有三个版本:

  • 开源Java(Jython索引器)
  • 封闭源Java(隐藏在谷歌中)
  • 开源Python(迷你pysonar)

它们都没有(封闭源代码除外)完全实现.但基本的想法是你可以用它作为你工作的基础.