代码之家  ›  专栏  ›  技术社区  ›  sharkin

如何确保所有的python代码都“编译”?

  •  14
  • sharkin  · 技术社区  · 15 年前

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

    当我用python编写了一些东西并达到可以运行它的程度时,仍然不能保证没有语言特定的错误存在。对我来说,这意味着我不能仅仅依靠我的运行时防御(对输入、断言等的严格测试)来避免崩溃,因为在6个月内,当一些原本不错的代码最终运行时,它可能会因为一些愚蠢的打字错误而破裂。

    显然,应该对系统进行足够的测试,以确保所有代码都已运行,但大多数时候我在内部脚本和小型工具中使用python,这当然不会引起他们需要的QA注意。另外,一些代码是如此简单,如果你的背景是C/C++,那么只要编译它(例如,类内的吸收器方法,通常是成员变量的简单返回),它就可以正常工作。

    所以,我的问题很明显——有没有任何方法(使用一个特殊的工具或其他东西)可以确保我的Python脚本中的所有代码都将“编译”并运行?

    5 回复  |  直到 15 年前
        1
  •  21
  •   Matthew Flaschen    15 年前

    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()
    
        2
  •  2
  •   Imagist    15 年前

    其他人也提到过类似pylint这样的工具,这些工具非常好,但其长短不一的原因是,完全不可能做到100%。事实上,你甚至可能不想这样做。Python动态性的一部分好处是,您可以做一些疯狂的事情,比如通过字典访问将名称插入本地范围。

    归根结底,如果您想在编译时捕获类型错误,就不应该使用Python。语言选择总是涉及一系列的权衡。如果您选择python而不是c,请注意,为了更快的开发、更好的字符串操作等,您需要交易一个强大的类型系统。

        3
  •  1
  •   Adam Luter    15 年前

    我认为您需要的是代码测试行覆盖率。您希望将测试添加到脚本中,以确保所有代码行,或尽可能多的代码行都得到测试。测试是一项很大的工作,但是如果你想要你所要求的那种保证,就没有免费的午餐,对不起:(。

        4
  •  1
  •   Kiv    15 年前

    如果您使用Eclipse Pydev 作为一个IDE,它可以立即用红色斜线标记许多输入错误,并且还集成了pylint。例如:

    foo = 5
    print food
    

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

    一般来说,您只能静态地分析您的代码,直到您的代码实际上是静态的;代码越动态,您真正需要的自动化测试就越多。

        5
  •  0
  •   Alex Morega    15 年前

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