嗯,我不是很擅长Python编程,但我想答案是“是的”。
任何允许您随时使用任何名称创建变量的动态语言都可以使用“strict”指令。
在Perl中,Strict vars(Perl中严格选项之一,“use strict”同时打开所有选项)要求在使用变量之前声明所有变量。这意味着此代码:
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),我都感到紧张。我不是一个完美的打字员。一个简单但难以发现的错别字可能会导致您的代码以难以追踪的方式失败。
因此,重申一下,是的,Python可以使用“严格”编译指示来打开可以在编译时检查的内容的编译时检查。我想不出需要添加的任何其他检查,但是更好的Python程序员可能会想到一些。
注意:我专注于Perl中严格变量的实用效果,并忽略了一些细节。如果您真的想了解所有详细信息,请参阅
strict的perldoc。
更新:对一些评论的回应
Jason Baker:像pylint这样的静态检查器很有用。但是它们代表了可能被跳过的额外步骤。在编译器中构建一些基本检查可确保这些检查始终得到执行。如果这些检查可以通过编译指示进行控制,那么即使与检查相关的成本方面的反对也将失去意义。
popcnt:我知道Python会生成运行时异常。我已经这么说了。我主张尽可能进行编译时检查。请重新阅读文章。
mpeters:对代码进行的计算机分析无法找出所有错误,这等同于解决停机问题。更糟糕的是,为了在作业中找到拼写错误,编译器需要知道你的意图,并找到你的意图与代码不符的地方。这显然是不可能的。
然而,这并不意味着不应该进行任何检查。如果有易于检测的问题类别,则有意义去捕获它们。
我不太熟悉pylint和pychecker可以发现哪些类型的错误。正如我所说,我在Python方面非常没有经验。
这些静态分析程序很有用。但是,我认为,除非它们复制了编译器的功能,否则编译器始终将处于比任何静态检查器更了解程序的位置。利用这一点尽可能减少错误似乎是浪费的。
更新2:
cdleary - 理论上,我同意您的观点,静态分析器可以执行编译器能够执行的任何验证。在Python的情况下,这应该足够了。
然而,如果您的编译器足够复杂(特别是如果您有许多改变编译方式的预处理指令,或者像Perl一样,可以在编译时运行代码),则静态分析器必须接近编译器/解释器的复杂性才能进行分析。
哎呀,所有这些关于复杂编译器和在编译时运行代码的讨论都显示了我的Perl背景。
我理解Python没有编译指示,并且不能在编译时运行任意代码。因此,除非我错了或这些功能被添加,否则静态分析器中相对简单的解析器就足够了。强制在每次执行时进行这些检查肯定会有所帮助。当然,我会使用编译指示来实现这一点。
一旦你将编译指示加入到混合中,你就开始走下一个滑坡,你的分析器的复杂性必须与你提供的编译指示的能力和灵活性成比例地增长。如果不小心,你可能会像Perl一样,然后“只有Python可以解析Python”,这是我不想看到的未来。
也许命令行开关是添加强制静态分析的更好方式;)
(当我说Python不能像Perl那样干扰编译时行为时,我绝不打算贬低Python的能力。我有一种预感,这是一个经过深思熟虑的设计决策,我可以看出其中的智慧。Perl在编译时的极大灵活性,在我看来,既是一种巨大的优势,也是一种可怕的语言缺陷;我也看到了这种方法的智慧。)
non-local
声明使事情变得更加复杂(或者说更加清晰)- 就像http://www.python.org/dev/peps/pep-3104/中所述。 - popcntuse strict 'vars'
)的好文章(在我看来),一篇来自 Perlmonk,另一篇来自 Pythonic 视角:http://www.perlmonks.org/?node_id=755790 http://mail.python.org/pipermail/python-3000/2006-October/003968.html - Oktalist