我正在使用现有的大型 Python 代码库,并希望开始添加类型注释,以便获得一定程度的静态检查。我在想象类似的事情Erlang http://www.erlang.org/doc/reference_manual/typespec.html, 强语 http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.51.4406, or 类型化方案/球拍 http://docs.racket-lang.org/ts-guide/more.html#%28part._.Type_.Annotation_and_.Binding_.Forms%29.
我见过快速而肮脏的装饰器,它们根据函数参数和返回类型注释插入动态检查,但我正在寻找更强大并且在编译时执行检查的东西。
现在有哪些工具可以用于此类事情?我熟悉编译器和类型检查,如果一个不完整的工具有良好的基础,我绝对愿意对其进行改进。
(注意:我对静态类型的优缺点的讨论不感兴趣。)
EDIT: 一个例子:
def put(d, k, v):
d[k] = v
我希望能够注释put
函数具有类型put<K,V>(dict<K,V>, K, V) -> None
.
UPDATE: 新的PEP 484 https://www.python.org/dev/peps/pep-0484/(2014 年 9 月)定义了 Python 3.5+ 中静态类型和类型注释的标准。有一个类型检查工具叫做mypy http://mypy-lang.org/与 PEP 484 兼容。
2016年11月11日编辑:只需使用mypy http://www.mypy-lang.org/。可以逐渐添加类型提示。在Python 3源代码中,它验证了标准PEP 484 https://www.python.org/dev/peps/pep-0484/键入提示。 Python 2 中仍然可以使用特殊注释来表达类型。圭多喜欢 https://mail.python.org/pipermail/python-ideas/2014-August/028618.html.
这篇文章最初是在 mypy 出现之前很久以前写的。我保留了下面帖子的原始内容,尽管它不太准确。
原帖:
您可能想查看本文中提到的一些项目有关 Python 静态分析的相关 StackOverflow 帖子 https://stackoverflow.com/questions/35470/are-there-any-static-analysis-tools-for-python.
总之:
- pylint http://www.logilab.org/project/pylint
- PyFlakes http://pypi.python.org/pypi/pyflakes
- py检查器 http://pychecker.sourceforge.net/
由于Python使用鸭子打字 http://en.wikipedia.org/wiki/Duck_typing更广泛地说,在其他语言中可能被称为“类型错误”的东西最终可能会变成“对象”X不支持方法Y“在Python中。
2011年5月17日编辑:
我同意 delnan 的观点,静态类型对于 Python 来说是不可能的[显然是错误的]。但由于我们的怀疑似乎并没有阻止您,所以我只能向您提供有关该主题的更多信息。有请:
- 的讨论Python 的类型推断 http://lambda-the-ultimate.org/node/1519。 (其他链接来自这里。)
- Guido van van Rossum 关于添加可选静态类型的文章:part 1 http://www.artima.com/weblogs/viewpost.jsp?thread=85551 and part 2 http://www.artima.com/weblogs/viewpost.jsp?thread=86641.
-
RPython http://code.google.com/p/rpython/,Python 的一个子集,可能有机会进行足够的静态分析以进行某种形式的类型检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)