14

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

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

显然,一个系统应该经过足够的测试以确保所有代码都已运行,但大多数时候我将 Python 用于内部脚本和小工具,这当然从来没有得到他们需要的 QA 关注。此外,有些代码非常简单(如果你的背景是 C/C++),你知道只要它编译它就可以正常工作(例如类中的 getter 方法,通常是成员变量的简单返回)。

所以,我的问题很明显 - 有什么方法(使用特殊工具或其他工具)可以确保我的 Python 脚本中的所有代码都能“编译”并运行吗?

4

5 回答 5

21

看看PyCheckerPyLint

这是 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()
于 2009-06-22T12:39:34.323 回答
2

其他人提到了像 PyLint 这样非常好的工具,但总而言之,它根本不可能做到 100%。事实上,你甚至可能不想这样做。Python 的动态性的部分好处是您可以做一些疯狂的事情,例如通过字典访问将名称插入本地范围。

归根结底,如果您想要一种在编译时捕获类型错误的方法,则不应使用 Python。语言选择总是涉及一系列权衡。如果您选择 Python 而不是 C,请注意,您正在交易一个强大的类型系统以实现更快的开发、更好的字符串操作等。

于 2009-06-30T03:26:18.470 回答
1

我认为您正在寻找的是代码测试行覆盖率。您想在脚本中添加测试,以确保您的所有代码行或尽可能多的代码行都经过测试。测试是一项繁重的工作,但如果你想要你所要求的那种保证,没有免费的午餐,对不起:(。

于 2009-06-22T12:39:25.773 回答
1

如果您将 Eclipse 与Pydev 一起用作 IDE,它可以立即用红色波浪线为您标记许多拼写错误,并且还集成了 Pylint。例如:

foo = 5
print food

将被标记为“未定义变量:食物”。当然,这并不总是准确的(也许食物是之前使用 setattr 或其他奇异技术定义的),但它在大多数情况下都很好用。

一般来说,您只能在代码实际上是静态的范围内静态分析您的代码;你的代码越动态,你就越需要自动化测试。

于 2009-06-22T13:09:00.613 回答
0

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

于 2009-06-22T12:49:04.053 回答