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

sha*_*kin 14 python parsing code-analysis

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

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

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

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

Mat*_*hen 21

看看PyCheckerPyLint.

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

print a
Run Code Online (Sandbox Code Playgroud)

如您所见,它检测到未定义的变量,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        |=          |
Run Code Online (Sandbox Code Playgroud)

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

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

print baz(input("True or False: "))
Run Code Online (Sandbox Code Playgroud)

编辑: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()
Run Code Online (Sandbox Code Playgroud)

  • +1因为这些工具肯定有帮助.但是如果你测试逻辑线而不是物理线,线覆盖会发现上面的拼写错误.另外,我很困惑为什么PyChecker抱怨'a'而不是'fo0'? (2认同)