我的背景是C和C++。我非常喜欢Python,但它有一个方面(以及其他解释语言,我猜)在您习惯于编译语言时很难使用。
当我用python编写了一些东西并达到可以运行它的程度时,仍然不能保证没有任何语言特定的错误存在。对我来说,这意味着我不能仅仅依靠我的运行时防御(对输入、断言等的严格测试)来避免崩溃,因为在6个月内,当一些原本不错的代码最终运行时,它可能会因为一些愚蠢的打字错误而破裂。
显然,应该对系统进行足够的测试,以确保所有代码都已运行,但大多数时候我在内部脚本和小型工具中使用python,这当然不会引起他们需要的QA注意。另外,一些代码是如此简单,如果你的背景是C/C++,那么只要编译它(例如,类内的吸收器方法,通常是成员变量的简单返回),它就可以正常工作。
所以,我的问题很明显——有没有任何方法(使用特殊的工具或其他东西)可以确保我的Python脚本中的所有代码都将“编译”并运行?
最佳答案
看看PyChecker和PyLint。
下面是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()