我正在使用一个大型的现有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兼容。
你会发现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不可能使用静态类型。但既然我们的怀疑似乎并没有吓倒你,我只能给你更多关于这个问题的信息。我出席:
看看这篇文章:PySonar: a Static Analyzer for Python。PySonar是一个使用代码的抽象解释(部分执行)来推断类型的工具。它查找程序的所有可能执行路径,并查找所有变量的所有可能类型。
PySonar基本上有三种版本:
它们中的任何一个(除了封闭源代码一个)都没有完全实现。但基本的想法是你可以把它作为你工作的基础。
相关问题 更多 >
编程相关推荐