好吧,我不是一个 Python 程序员,但我会说答案是“是”。
任何允许您随时创建具有任何名称的变量的动态语言都可以使用“严格”编译指示。
Perl 中的严格变量(Perl 中的严格选项之一,“使用严格”将它们全部打开)要求在使用之前声明所有变量。这意味着这段代码:
my $strict_is_good = 'foo';
$strict_iS_good .= 'COMPILE TIME FATAL ERROR';
在编译时生成致命错误。
我不知道如何让 Python 在编译时拒绝此代码:
strict_is_good = 'foo';
strict_iS_good += 'RUN TIME FATAL ERROR';
您将得到一个strict_iS_good
未定义的运行时异常。但仅在代码执行时。如果您的测试套件没有 100% 的覆盖率,您可以轻松发布此错误。
每当我使用一种没有这种行为的语言(例如 PHP)工作时,我都会感到紧张。我不是一个完美的打字员。一个简单但难以发现的错字可能会导致您的代码以难以追踪的方式失败。
因此,重申一下,YES Python 可以使用“严格”编译指示来打开编译时检查,以检查可以在编译时检查的内容。我想不出要添加的任何其他检查,但更好的 Python 程序员可能会想到一些。
请注意,我专注于 Perl 中 stict vars 的实用效果,并忽略了一些细节。如果您真的想了解所有详细信息,请参阅perldoc for strict。
更新:对一些评论的回应
Jason Baker:像 pylint 这样的静态检查器很有用。但它们代表了一个可以并且经常被跳过的额外步骤。在编译器中构建一些基本检查可确保始终如一地执行这些检查。如果这些检查可以通过编译指示来控制,那么即使是与检查成本相关的反对意见也变得毫无意义。
popcnt:我知道 python 会生成运行时异常。我说了这么多。我提倡尽可能进行编译时检查。请重读帖子。
mpeters:没有任何计算机分析代码可以发现所有错误——这相当于解决了停机问题。更糟糕的是,要找到分配中的拼写错误,您的编译器需要知道您的意图并找到您的意图与代码不同的地方。这显然是不可能的。
然而,这并不意味着不应该进行检查。如果存在易于检测的问题类别,那么捕获它们是有意义的。
我对 pylint 和 pychecker 不够熟悉,无法说出它们会捕获哪些类型的错误。正如我所说,我对 python 非常缺乏经验。
这些静态分析程序很有用。但是,我相信除非它们复制编译器的功能,否则编译器将始终比任何静态检查器都能够“了解”更多关于程序的信息。尽可能不利用这一点来减少错误似乎很浪费。
更新 2:
cdleary - 理论上,我同意你的看法,静态分析器可以做任何编译器可以做的验证。在 Python 的情况下,它应该足够了。
但是,如果您的编译器足够复杂(尤其是如果您有很多编译指示会改变编译的发生方式,或者如果像 Perl 一样,您可以在编译时运行代码),那么静态分析器必须接近编译器/解释器的复杂性以做分析。
嘿,所有这些关于复杂编译器和编译时运行代码的讨论都显示了我的 Perl 背景。
我的理解是Python没有编译指示,不能在编译时运行任意代码。因此,除非我错了或添加了这些功能,否则静态分析器中相对简单的解析器就足够了。在每次执行时强制进行这些检查肯定会有所帮助。当然,我这样做的方式是使用编译指示。
一旦您将 pragma 添加到组合中,您就开始走下一个滑坡,并且分析器的复杂性必须与您在 pragma 中提供的功能和灵活性成正比。如果你不小心,你可能会像 Perl 一样结束,然后“只有 python 可以解析 Python”,这是我不想看到的未来。
也许命令行开关是添加强制静态分析的更好方法;)
(当我说 Python 不能像 Perl 那样适应编译时行为时,绝不是要批评 Python 的功能。我有一种预感,这是一个经过仔细考虑的设计决策,我可以从中看到智慧。Perl 的恕我直言,编译时的极大灵活性是该语言的一大优势和一个可怕的弱点;我也看到了这种方法的智慧。)