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

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

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

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

有帮助吗?

解决方案

查看 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()

其他提示

其他人已经提到像PyLint这样的工具非常好,但它的长期和短期是它根本不可能做到100%。事实上,你甚至可能不想这样做。 Python的动态性的一部分好处是你可以通过字典访问来做一些疯狂的事情,比如在本地范围内插入名称。

归结为如果你想在编译时捕获类型错误,就不应该使用Python。语言选择总是涉及一系列权衡。如果您选择Python而不是C,请注意您正在交易强类型系统以加快开发速度,更好地进行字符串操作等。

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

如果您使用Eclipse并将 Pydev 用作IDE,它可以用红色标记许多拼写错误立即波动,并且也有Pylint整合。例如:

foo = 5
print food

将被标记为“Undefined variable:food”。当然,这并不总是准确的(可能早先使用setattr或其他奇特的技术来定义食物),但它在大多数时候都很有效。

通常,您只能在代码实际上是静态的情况下静态分析代码;代码越动态,您就越需要自动化测试。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top