如何确保我的所有Python代码“编译”通过?
我之前主要用C和C++编程,现在我很喜欢Python。不过,有一点让我觉得很难适应,那就是Python和其他解释型语言在某些方面跟我习惯的编译型语言不太一样。
当我在Python中写完代码,准备运行的时候,并不能保证代码里没有语言特有的错误。这对我来说意味着,我不能仅仅依靠运行时的防护措施(比如严格测试输入、使用断言等)来避免程序崩溃。因为可能过了六个月,当我终于运行一些看似不错的代码时,可能会因为一个小小的拼写错误而出问题。
当然,系统应该经过充分的测试,以确保所有代码都被执行过。但大多数时候,我用Python写的是一些内部脚本和小工具,这些通常不会得到质量保证团队的关注。而且,有些代码非常简单(如果你是C/C++背景),你知道只要能编译就一定能正常工作(比如类里面的获取方法,通常只是简单返回一个成员变量)。
所以,我的问题很简单——有没有什么方法(比如特别的工具)可以确保我Python脚本里的所有代码都能“编译”并运行呢?
5 个回答
如果你在用Eclipse这个开发工具,并且安装了Pydev,它可以帮你快速发现很多拼写错误,显示红色波浪线。而且,它还可以和Pylint这个工具结合使用,来检查代码的质量。比如:
foo = 5
print food
这段代码会被标记为“未定义的变量:food”。当然,这种检查并不总是准确的(比如food可能是之前用setattr或其他特殊方法定义的),但大多数情况下它的效果还是不错的。
一般来说,你只能在代码是静态的情况下进行静态分析;如果你的代码很动态,那你就更需要自动化测试来确保它的正确性。
其他人提到了一些工具,比如PyLint,这些工具确实不错,但总的来说,想要做到100%是根本不可能的。实际上,你可能甚至不想做到这一点。Python的动态特性让你可以做一些疯狂的事情,比如通过字典访问把名字插入到本地作用域中。
归根结底,如果你想在编译时捕捉类型错误,那就不要用Python。选择一种编程语言总是有利有弊。如果你选择Python而不是C语言,记住你是在用更快的开发速度、更好的字符串处理等,来换取一个强类型系统。
你可以看看 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()