我的背景是C和C ++。我非常喜欢Python,但是当你习惯于编译语言时,它的一个方面(以及我猜测的其他解释语言)真的很难用。
当我用Python编写内容并且可以运行它时,仍然无法保证不会出现特定于语言的错误。对我而言,这意味着我不能完全依赖我的运行时防御(严格测试输入,断言等)以避免崩溃,因为在6个月内,当一些其他好的代码最终运行时,它可能会因为一些愚蠢的错误而破解
显然,系统应该经过足够的测试以确保所有代码都已运行,但大部分时间我都使用Python作为内部脚本和小工具,这些内容永远不会得到他们所需的QA关注。此外,一些代码非常简单(如果您的背景是C / C ++),您知道只要编译它就会正常工作(例如,类中的getter-methods,通常是成员变量的简单返回)。
所以,我的问题很明显 - 有什么方法(使用特殊工具或其他东西)我可以确保我的Python脚本中的所有代码都会“编译”并运行吗?
答案 0 :(得分:21)
这是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()
答案 1 :(得分:2)
其他人已经提到像PyLint这样的工具非常好,但它的长期和短期是它根本不可能做到100%。事实上,你甚至可能不想这样做。 Python的动态性的一部分好处是你可以通过字典访问来做一些疯狂的事情,比如在本地范围内插入名称。
归结为如果你想在编译时捕获类型错误的方法,你不应该使用Python。语言选择总是涉及一系列权衡。如果您选择Python而不是C,请注意您正在交易强类型系统以加快开发速度,更好地进行字符串操作等。
答案 2 :(得分:1)
我认为您正在寻找的是代码测试线覆盖率。您希望在脚本中添加测试,以确保您的所有代码行或您有时间的代码都经过测试。测试是一项繁重的工作,但如果你想要的那种保证,就没有免费的午餐,对不起:(。
答案 3 :(得分:1)
如果您使用带有Pydev的Eclipse作为IDE,它可以立即为您标记许多拼写错误的红色波浪线,并且还具有Pylint集成。例如:
foo = 5
print food
将被标记为“未定义的变量:食物”。当然,这并不总是准确的(可能早先使用setattr或其他奇特的技术来定义食物),但它在大多数时候都很有效。
通常,您只能在代码实际上是静态的情况下静态分析代码;代码越动态,您就越需要自动化测试。
答案 4 :(得分:0)
您的代码实际上在运行时被编译,如果代码中存在语法错误,Python运行时会抱怨。与静态编译的语言(如C / C ++或Java)相比,它不会检查变量名称和类型是否正确 - 因为您需要实际运行代码(例如,使用自动化测试)。