繁体   English   中英

如何确保我的所有Python代码“编译”?

[英]How can I make sure all my Python code “compiles”?

我的背景是C和C ++。 我非常喜欢Python,但是当你习惯于编译语言时,它的一个方面(以及我猜的其他解释语言)真的很难用。

当我用Python编写一些内容并且可以运行它时,仍然无法保证不会出现特定于语言的错误。 对我而言,这意味着我不能完全依赖我的运行时防御(严格测试输入,断言等)以避免崩溃,因为在6个月内,当一些其他好的代码最终运行时,它可能会因为一些愚蠢的错误而破解。

显然,系统应该经过足够的测试,以确保所有代码都已运行,但大部分时间我都使用Python作为内部脚本和小工具,这些内容永远不会得到他们所需的QA关注。 此外,一些代码非常简单(如果您的背景是C / C ++),您知道只要编译它就会正常工作(例如,类中的getter-methods,通常是成员变量的简单返回)。

所以,我的问题是显而易见的 - 有什么方法(使用特殊工具或其他东西)我可以确保我的Python脚本中的所有代码都将“编译”并运行?

看看PyCheckerPyLint

这是pylint的示例输出,由琐碎的程序产生:

print a

如您所见,它检测到未定义的变量,py_compile不会(故意)。

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

为什么测试不够好的简单例子,即使它们涵盖“每一行”:

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

编辑:PyChecker为我处理三元组:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()

其他人提到像PyLint这样的工具非常好,但是它的长期和短期是它根本不可能做到100%。 事实上,你甚至可能不想这样做。 Python的动态性的一部分好处是你可以通过字典访问来做一些疯狂的事情,比如在本地范围内插入名称。

它归结为如果你想要一种在编译时捕获类型错误的方法,你不应该使用Python。 语言选择总是涉及一系列权衡。 如果您选择Python over C,请注意您正在交易强类型系统,以便更快地开发,更好的字符串操作等。

我认为你要找的是代码测试线覆盖。 您希望在脚本中添加测试,以确保您的所有代码行或您有时间的代码都经过测试。 测试是一项繁重的工作,但如果你想要的那种保证,就没有免费的午餐,对不起:(。

如果您将Eclipse与Pydev一起用作IDE,它可以立即标记许多拼写错误的红色波浪形,并且还具有Pylint集成。 例如:

foo = 5
print food

将被标记为“未定义的变量:食物”。 当然,这并不总是准确的(可能早先使用setattr或其他奇特的技术来定义食物),但它在大多数时候都很有效。

通常,只能在代码实际上是静态的情况下静态分析代码; 代码越动态,您就越需要自动化测试。

您的代码在运行时实际上已编译,如果代码中存在语法错误,Python运行时将会抱怨。 与静态编译的语言(如C / C ++或Java)相比,它不会检查变量名称和类型是否正确 - 因为您需要实际运行代码(例如,使用自动化测试)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM