有存在 静态分析工具蟒蛇, 但编制时间检查的往往是针锋相对的 运行时结合的理念 Python拥抱。它的 可能的 包装的标准蟒蛇的口译有一个静态的分析工具来执行一些"使用严格的"般的约束,但是我们没有看到任何普遍通过这样的事情。

是不是有什么关蟒蛇,使得"使用严格的"行为不必要的或特别不希望?

或者,是"使用严格的"行为不必要在Perl,尽管广泛采用?

注:通过"必要的",我的意思是"实际上必要的",而不是严格必要的。很明显你 可以 写Perl没有"使用严格的",但(从我所看到的)最Perl编程人员 使用它。

注:蟒蛇口译员-包装不需要 需要 "使用严格的"状约束--你可以使用一个伪pragma类似于"使用严格的",将可以忽略通过正常解释。我不是在谈论增加一个语言水平的功能。


更新:解释什么是"使用严格的"不在Perl每意见。(链接到正式文件是在第一段。)

"使用严格的"指令有三个不同的部件,只有两个是真的很有趣:

  • 使用严格var:静态检查词法范围的变量使用在你的节目。(铭记的是,在蟒蛇,基本上只有 global 范围和 local 范围).许多Python绒检查这样的事情。因为这是唯一的静态分析,他们可以做,绒假设你用简单词汇范围和提醒你的东西出现错误的,在这个意义上说,直到你告诉他们闭嘴;即

    FOO = 12
    foo += 3
    

    如果你不做任何幻想与你的名字空间,这可能是有用的检查拼写错误。

  • 使用严格的裁判:防止象征性的名字空间的取消引用.蟒蛇的最近使用的是模拟 locals()globals() 要做到象征性的结合和标识查询。

  • 使用严格的潜艇:没有真正的模拟在蟒蛇。

有帮助吗?

解决方案

"运行时结合的理念,蟒蛇的拥抱...使得"使用严格的"行为不必要的[和]特别是不受欢迎"

很好的概要。谢谢。

基本上它。静态分析工具不要帮助,蟒蛇,足以值得的。


编辑

"我要求对我们在反省 为什么 我们不需要它并且,相关的是,为什么Perl编程人员认为他们不需要它"。

因为恰恰是因为你已经给了.我们不需要它,因为它没有帮助。很明显,你不喜欢这个答案,但是没有更多要说的。编译时或预先编译时间的检查根本没有帮助。

然而,由于你花时间来问问题了,我会提供更多的证据来回答你已经放弃了。

我写Java几乎一样多,因为我写的蟒蛇。Java是静态型的检查,并不阻止任何逻辑的问题;它没有促进会议的性能要求;它不会帮助满足使用情况。它甚至没有减少量单元的测试。

而静态型检查并点偶尔滥用的一种方法,你找到这个出同样迅速地在蟒蛇。在Python你找到它在单元的测试时间,因为它不会运行。注:我不是说是错误的类型被发现有很多聪明的单元的测试,我是说,大多数是错误的类型问题是发现通过未经处理的例外情况的事情根本不会跑远远不够,获得测试的说法。

为什么是Pythonistas不要浪费时间上的静态检查是简单的。我们不需要它。它没有提供任何价值。这是一个级别的分析没有经济效益。它不会让我任何更能够解决的真正问题的真正人们是具有与他们的真实数据。

来看看最受欢迎的,所以Python问题的语言(不是问题领域或库)有关。

是否有任何差异之间的"富有"和"foo==None"? -- ==is.没有静态检查可以帮助这一点。此外,看到 之间有区别`==`与`是`在蟒蛇?

什么是**(双星)和(明星)为参数? -- *x 给出了一个列表, **x 给出了一个词典。如果你不知道这一点,程序立即死亡的时候你尝试做一些不适用于那些类型。"如果你的计划从来没有做任何事情'不适当'".然后你的节目工作。'nuff说。

怎么我可以代表一个'Enum'在蟒蛇? -这是抗辩对某种有限域类型。一类与级别的价值几乎不会的工作。"如果有人改变分配".容易建立。重写 __set__ 提出的一个例外。是的静态检查可能发现这一点。没有,它不会发生在实践中,有人得到困惑的一枚举恒和一个变量;而当他们这样做,它很容易被发现在运行时间。"如果有什么逻辑永远不会得到执行".嗯,这是设计不良和贫穷的单元的测试。投掷的一个编译程序错误和错误的逻辑,这是从来没有测试是没有更好的比,会发生什么在动态的语言,当它从来没有进行测试。

发生器式与列表理解 --静态检查并不能帮助解决这个问题。

为什么1+++2 =3? --静态检查不会点这个。1+++2 C是完全合法的,尽管所有的编译器检查。它是不一样的东西在蟒蛇,因为它是在C,但只是作为法律。而且,正如令人困惑。

清单列出变化反映在子表出乎意料 -这是完全概念。静态检查不能帮助解决这个问题。Java等还将编制和行为严重。

其他提示

好吧,我没有太大的蟒蛇的程序员,但我敢说答案是"是"。

任何的动态语言,您可以创建一个可变的任何名称的在任何时候,可以使用'严格'杂注。

严格vars(选项之一,严格在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例如),我感到紧张。我不是一个完美的打字员。一个简单,但很难点,错误可能会导致你的代码失败的方式,可能会难以追查。

因此,为了重申, 是的 蟒蛇可以使用'严格'pragma把在编制时间检查的事情,可以检查在编制时间。我想不出任何其他检查,以增加,但一个更好的蟒蛇的程序员可能认为一些。

注意到 我专注于实际效果的stict vars in Perl,我掩饰的一些细节。如果你真的想知道所有的细节见 该perldoc为严格的.

更新:答复一些评论意见

杰森*贝克 :静态的棋子喜欢pylint是有用的。但是他们代表着一个额外的步骤,可以和往往是跳过。建筑物的一些基本的检查进入编译器的保证,这些检查都进行一致。如果这些检查可通过说明,即使反对有关的成本检查变得没有实际意义。

popcnt :我知道,蟒蛇将生成一个运行时例外。我说的一样多。我主张编制时间检查其可能的。请再读一职。

mpeters :没有计算机分析的代码可以找到所有的错误--这个数额的解决终止问题。更糟糕的是,找到打字错误,在任务,编译器将需要知道你的 意图 并找到的地方,你的意图不同于你的代码。这是非常清楚不可能的。

然而,这并不意味着没有检查应该做的。如果有类的问题,很容易检测,然后是有意义的捕获它们。

我没有足够的熟悉pylint和pychecker说什么类的错误,他们会赶上。正如我所说的我感到非常缺乏经验与蟒蛇。

这些静态分析方案是有用的。然而,我认为,除非他们重复的能力编译器,编译器将总是能够知道更多关于本节目比任何静态检测器可以。它似乎浪费不要利用这一优势来减少错误的可能。

更新2:

cdleary-在理论上,我同意你的静态分析器可以做任何验证编译器。和在的情况下,蟒蛇,它应该是足够的。

但是,如果你编译器是复杂的足够(特别是如果你有很多杂注更改如何汇编的出现,或如果喜欢Perl,你可以跑码在编制时间),然后静态分析必须做法的复杂性编译/口译员做了分析。

嘿,所有这些讨论的复杂编译器和运行的代码汇编时间表示我Perl背景。

我的理解是,蟒蛇不具有指示,可以不执行任意码在编译时间。因此,除非我是错误的,或者这些功能加,一个相对简单的分析器在静态分析应该足够了。这肯定将是有益的力量这些检查,在每一个执行。当然,我愿意做这是个杂注。

一旦添加了标注的混,你已经开始下滑的斜坡和复杂的,你分析必须发展壮大比例的权力和灵活性,您提供您的指示.如果你不小心,你可以像Perl,然后"只蟒蛇可以分析蟒蛇,"未来的我不想看到的。

也许命令线路开关将是一个更好的方式来加强静态分析;)

(在没有办法做打算对蟒蛇的能力时我说,这不能乱编译时间的行为,如Perl。我有一种预感,这是一个仔细考虑设计的决定,我可以看到的智慧。Perl的极大的灵活性,在编制时间,恕我直言,一个强大的实力和可怕的弱点的语言;我看到了智慧,在这一办法。)

蟒蛇不会有的东西,可以更改脚本语法:

from __future__ import print_function

和其他各种未来的特点,语法的影响。这只是蟒蛇的语法已经更加严格,稳定和更好的定义比历史Perl;这种事情'严格的裁判"和"严格替补'禁止从来没有存在的蟒蛇。

'严格var'主要是为了停止typoed引用并错过了出'我是从创建意外globals(嗯,包装的变量在Perl言)。这不可能发生在Python裸的任务默认当地的宣言》,和裸露的未分配符号结果在一个例外。

(还有的情况下,用户不小心试着写过一个全球性的,而不宣布它与"全球"的声明,造成或者意外地方,或者更经常、UnboundLocalError.这往往要学会相当迅速,但这是一个值得商榷情况下具有宣告你的当地人可能会有帮助。尽管几个经验丰富的蟒蛇的程序员会接受的可读性的负担。)

其他的语言和图书馆的变化,不涉及法处理过的 警告 系统。

我觉得有些困惑为什么"使用严格",从评论意见我所看到的。它不会在编制的时间类型的检查(像Java)。在这个意义上,Perl progammers是在协议与蟒蛇的程序员。作为S.洛特说上述这些类型的检查,不保护对抗的逻辑错误,不降低数量的单元测试你需要编写并且我们也不大粉丝束缚编程。

这是什么名单"使用严格的"不这样做:

  1. 使用象征性的参考文献被一个运行的时间错误。这能防止你做疯狂的(但是,有时有用的东西像)

    $var = 'foo';

    $foo = 'bar';

    print $$var; # this would contain the contents of $foo unless run under strict

  2. 使用未经申报的变量是一个错误的时间(这意味着你需要用"我的","我们的"或"地方"声明您可变的范围之前采用。

  3. 所有barewords被认为是汇编时的语法错误。Barewords词没有被宣布为符号或子程序。这主要是禁止的东西,这是历史上这样做,但被认为是一个错误。

Python没有真正的词汇的界定范围,因此严格瓦尔不会非常明智的。它没有象征性的参考文献据我所知,所以它已不需要进行严格的裁判。它没有barewords,所以它已不需要严格瓦尔.

说实话,它的唯一词汇范围界定我错过。其他两个我会考虑的疣在Perl。

这个原始的答案是正确的,但是不许说明情况 在一个实际意义。

存在静态分析工具蟒蛇,但编制时间检查的往往是>针锋相对的运行时结合的理念,蟒蛇拥抱。

什么使用严格'提供了在Perl的能力,以确保一个错误拼写 或者变量名称(通常)抓住了在编译时间。这并提高码 可靠性,并加快发展。但是为了做这样的事情值得的, 你需要申报的变量。和Python式似乎阻碍。

因此,在蟒蛇,你永远也找不到了有关一个错误拼写可变直到你发现在 运行时间,指派你认为你不是正在做出的,或者说一个 表达似乎决心一意想不到的价值。捉住这种错误可以 耗费时间,尤其是作为程序获得大,并且作为人们被迫保持 代码开发的其他人。

Java和C/C++进一步采取这一步骤,与种类型的检查。动机是实际的, 而不是哲学。你可以如何赶上许多错误,因为可能,尽快,和可以确保消除所有他们之前释放的代码来的生产?每一种语言似乎采取特定的战略,并运行它根据什么他们 认为是重要的。在语言Perl,其中运行时结合不支持, 它是有意义的利用严格',使发展更加容易。

我考虑的 'use strict' 在Perl更像是一个pragma为你暗示:它改变行为的编译器。

Perl语言的理念是不同的蟒蛇的理念。作为在,你给予足够多的绳子挂自己反复的,在Perl。

拉里的墙是很大的成语言,因此我们必须从Perl什么被称为TIMTOWTDI(说 tim-toe-dee)原则与禅的蟒蛇:

应该有一个-好 只有一个--显而易见的方式来做到这一点。

你可以很容易地使用pylint和PyChecker拿出自己风味的 use strict python(或类似的东西 perl -cw *scriptname*)但是因为不同的哲学语言的设计,你会不会遇到这样在实践中广泛。

基于你的评论的第一张海报,你熟悉蟒蛇的 import this.有很多东西在那里,照亮为什么你没有看到一个相当于 use strict 在蟒蛇。如果你默想 公案 现在禅的蟒蛇,你可以找到启示自己。:)

我发现我只是真的关心检测引用未申报var.日蚀有pylint一体化通过PyDev,虽然pylint是远非完美,但它没有一个合理的工作。

它种类的反对蟒蛇的动态性质,我不得不添加#偶尔忽略了,在我的代码变得聪明一些东西。但我发现发生这种情况很少足够的,我感到高兴。

但我可以看到用一些pylint-一样的功能成为可以命令的形式线的标志。有点像Python2.6的-3开关,其识别点的不相容性之间的蟒蛇2.x和3。x代码。

这是非常困难的写入大方案没有使用严格'in Perl.没有使用严格',如果使用一个变量再次拼错留下一封信,该程序仍然运行。并没有试验的情况下,检查结果,你可以永远不会找到这样的错误。它可以是非常耗费时间,以找到为什么你得到错误的结果,由于这个原因。

我的一些Perl计划包括5 000线的10,000行的代码分成几十个模块。一个无法真正做到生产程没有使用严格'.我绝不会允许生产码可以安装在该厂与语言不强制执行"可变的声明".

这就是为什么Perl5.12.x现有的使用严格的'作为默认的行为。你可以把它们关掉。

PHP给了我不少问题,因为没有变宣言》的执行。所以你需要限制自己的小程序与这种语言。

只是一个意见...

abcParsing

Perl是一个无拘无束的语言,因为他们说:).所以你可以使用的变之前宣布;例如:如果使用var name"is_array"但类型,在"is_arrby",编译器不会的报告错误,没有"使用严格".所以当长编码程序在perl,更好地利用"使用严格的"发言。当然,少于50行为跑一次脚本,没有必要:)

这似乎是理想的"功能已大大增强"代码提供了很多的目的相同 use strict.

我没有Perl背景,但是从什么我知道,没有功能在蟒蛇,需要加以残疾人为了你的代码是"更可靠的",因此在这一意义上,我猜你可以说这是不必要的

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