python是否有像perl一样的“严格使用”和“使用警告”?
我正在学习Perl和Python … …在同一时间,不是我的devise,但它必须完成。
题:
在我使用的Perl脚本(见下文)在我的TXT的头部。
#!/usr/bin/env perl use strict; use warnings;
有没有什么我应该为我的Python脚本日常工作?
为了提供一个答案,或许可以避免一些评论噪音在这里,我会尝试另一个。
你原来的问题中的两个实用主义真正扩展到:
use strict "vars"; use strict "refs"; use strict "subs"; use warnings;
依次回答:
-
use strict "vars"
的效果是导致编译时错误引用一个variables,而不首先声明它存在(比如在更多的静态语言,如C,C ++和Java中的默认值)。 因为Python没有特定的语法来声明variables存在,所以它没有任何等价的东西。 如果不是先存在的话,那么在Python中赋予一个名称总是会创build它。strict
这个特性没有Python的等价物,它所提供的安全性是不能被重新创build的。
例如:
$ perl -c -e 'use strict "vars"; $foo = 1' Global symbol "$foo" requires explicit package name at -e line 1. -e had compilation errors. $ perl -c -e 'no strict "vars"; $foo = 1' -e syntax OK
-
use strict "refs"
的效果是禁止使用包含(现有或新的)variables名称的纯string作为variables本身的引用。 Python不这样做,所以不需要禁用它。
例如:
$ perl -e 'use strict "refs"; ${"message"} = "hello"; print $message' Can't use string ("message") as a SCALAR ref while "strict refs" in use at -e line 1. $ perl -e 'no strict "refs"; ${"message"} = "hello"; print $message' hello
-
use strict "subs"
的效果是导致编译时试图调用已知不存在的函数。 Python不会执行任何这样的检查,并且无法启用这样的function。
例如:
$ perl -c -e 'use strict "subs"; foo' Bareword "foo" not allowed while "strict subs" in use at -e line 1. -e had compilation errors. $ perl -c -e 'no strict "subs"; foo' -e syntax OK
-
use warnings
的效果是在编译和运行时在更早的版本中默认的各种types的行为上启用更多的警告,有时候可能是需要的,或者从来不是一个好主意,但不是严格的错误。 例如,使用未初始化的值作为数字通常应该给出警告,但是最初并没有这样做。
例如:
$ perl -e 'use warnings; my $u; print 2 + $u' Use of uninitialized value $u in addition (+) at -e line 1. 2 $ perl -e 'no warnings; my $u; print 2 + $u' 2
最后; 在__future__
有一些Python已经有类似的function。 然而,这不应该被认为与Perl的pragmata类似,因为后者大部分是词汇范围的,可以根据需要在小范围内启用或禁用; Python的__future__
只在整个源文件中启用。
例如。
use strict; use warnings; my $total; $total += count_things($_) for @list; { no warnings 'uninitialized'; printf "The total is %d\n", $total; }
一个有点人为的例子,但是这个例子演示了如何使用no warnings 'uninitialized'
的警告来禁用简单地在printf
语句中使用未初始化值的警告,同时仍然保持在其他地方启用其他警告。
总而言之:Python没有use strict
或任何接近等价的方法,因为它提供的任何安全特性都是强制的,或者在Python语言中不可use warnings
,并且没有use warnings
。 它提供的function仅在文件级别启用,不能根据范围有select地启用或禁用。
编辑:其实我已经被告知,Python确实有一些可控的警告标志,可以根据需要启用和禁用。
正如其他用户所发布的,Python没有严格的编译指示。 这在我看来是最大的缺陷之一。 而且,这是编程项目严重的原因之一,我仍然使用Perl。
毫无疑问,Python的奉献者会对此声明抱歉。 我听到有人说他们不需要严格。 我发现那些说这个的人通常不知道什么是严格的买你的。 在Python中考虑以下代码块:
def Main(): print(GetPrice(100,"Alaska")) print(GetPrice(100,"Florida")) print(GetPrice(100,"Michigan")) print(GetPrice(100,"Wisconsin")) def GetPrice(UnitPrice,State): StateSalesTaxRate = 0 if State == "Alabama": StateSalesTaxRate = 0.04 if State == "Alaska": StateSalesTaxRate = 0 if State == "Arizona": StateSalesTaxRate = 0.056 if State == "Arkansas": StateSalesTaxRate = 0.065 if State == "California": StateSalesTaxRate = 0.075 if State == "Colorado": StateSalesTaxRate = 0.029 if State == "Connecticut": StateSalesTaxRate = 0.0635 if State == "Delaware": StateSalesTaxRate = 0 if State == "Florida": StateSalesTaxRate = 0.06 if State == "Georgia": StateSalesTaxRate = 0.04 if State == "Guam": StateSalesTaxRate = 0.04 if State == "Hawaii": StateSalesTaxRate = 0.04 if State == "Idaho": StateSalesTaxRate = 0.06 if State == "Illinois": StateSalesTaxRate = 0.0625 if State == "Indiana": StateSalesTaxRate = 0.07 if State == "Iowa": StateSalesTaxRate = 0.06 if State == "Kansas": StateSalesTaxRate = 0.0615 if State == "Kentucky": StateSalesTaxRate = 0.06 if State == "Louisiana": StateSalesTaxRate = 0.04 if State == "Maine": StateSalesTaxRate = 0.055 if State == "Maryland": StateSalesTaxRate = 0.06 if State == "Massachusetts": StateSalesTaxRate = 0.0625 if State == "Michigan": StateSalesTexRate = 0.06 if State == "Minnesota": StateSalesTaxRate = 0.06875 if State == "Mississippi": StateSalesTaxRate = 0.07 if State == "Missouri": StateSalesTaxRate = 0.04225 if State == "Montana": StateSalesTaxRate = 0 if State == "Nebraska": StateSalesTaxRate = 0.055 if State == "Nevada": StateSalesTaxRate = 0.0685 if State == "New Hampshire": StateSalesTaxRate = 0 if State == "New Jersey": StateSalesTaxRate = 0.07 if State == "New Mexico": StateSalesTaxRate = 0.05125 if State == "New York": StateSalesTaxRate = 0.04 if State == "North Carolina": StateSalesTaxRate = 0.0475 if State == "North Dakota": StateSalesTaxRate = 0.05 if State == "Ohio": StateSalesTaxRate = 0.0575 if State == "Oklahoma": StateSalesTaxRate = 0.045 if State == "Oregon": StateSalesTaxRate = 0 if State == "Pennsylvania": StateSalesTaxRate = 0.06 if State == "Puerto Rico": StateSalesTaxRate = 0.105 if State == "Rhode Island": StateSalesTaxRate = 0.07 if State == "South Carolina": StateSalesTaxRate = 0.06 if State == "South Dakota": StateSalesTaxRate = 0.04 if State == "Tennessee": StateSalesTaxRate = 0.07 if State == "Texas": StateSalesTaxRate = 0.0625 if State == "Utah": StateSalesTaxRate = 0.0595 if State == "Vermont": StateSalesTaxRate = 0.06 if State == "Virginia": StateSalesTaxRate = 0.053 if State == "Washington": StateSalesTaxRate = 0.065 if State == "West Virginia": StateSalesTaxRate = 0.06 if State == "Wisconsin": StateSalesTaxRate = 0.05 if State == "Wyoming": StateSalesTaxRate = 0.04 return(UnitPrice*(1+StateSalesTaxRate)) if __name__ == '__main__': Main()
此代码计算购买成本,包括销售税。 当然,有更有效的方法来做到这一点,但这只是一个例子。
那么,你看到代码有什么问题吗? 没有? 尝试运行它。 当你这样做时:
100 106.0 100 105.0
还是没有看到问题? 那么你有一个比你知道的更大的问题。 这里是Perl中的等效代码:
use strict; sub Main { print GetPrice(100,"Alaska"), "\n"; print GetPrice(100,"Florida"), "\n"; print GetPrice(100,"Michigan"), "\n"; print GetPrice(100,"Wisconsin"), "\n"; } sub GetPrice { my($UnitPrice,$State) = @_; my $StateSalesTaxRate = 0; $StateSalesTaxRate = 0.04 if $State eq "Alabama"; $StateSalesTaxRate = 0 if $State eq "Alaska"; $StateSalesTaxRate = 0.056 if $State eq "Arizona"; $StateSalesTaxRate = 0.065 if $State eq "Arkansas"; $StateSalesTaxRate = 0.075 if $State eq "California"; $StateSalesTaxRate = 0.029 if $State eq "Colorado"; $StateSalesTaxRate = 0.0635 if $State eq "Connecticut"; $StateSalesTaxRate = 0 if $State eq "Delaware"; $StateSalesTaxRate = 0.06 if $State eq "Florida"; $StateSalesTaxRate = 0.04 if $State eq "Georgia"; $StateSalesTaxRate = 0.04 if $State eq "Guam"; $StateSalesTaxRate = 0.04 if $State eq "Hawaii"; $StateSalesTaxRate = 0.06 if $State eq "Idaho"; $StateSalesTaxRate = 0.0625 if $State eq "Illinois"; $StateSalesTaxRate = 0.07 if $State eq "Indiana"; $StateSalesTaxRate = 0.06 if $State eq "Iowa"; $StateSalesTaxRate = 0.0615 if $State eq "Kansas"; $StateSalesTaxRate = 0.06 if $State eq "Kentucky"; $StateSalesTaxRate = 0.04 if $State eq "Louisiana"; $StateSalesTaxRate = 0.055 if $State eq "Maine"; $StateSalesTaxRate = 0.06 if $State eq "Maryland"; $StateSalesTaxRate = 0.0625 if $State eq "Massachusetts"; $StateSalesTexRate = 0.06 if $State eq "Michigan"; $StateSalesTaxRate = 0.06875 if $State eq "Minnesota"; $StateSalesTaxRate = 0.07 if $State eq "Mississippi"; $StateSalesTaxRate = 0.04225 if $State eq "Missouri"; $StateSalesTaxRate = 0 if $State eq "Montana"; $StateSalesTaxRate = 0.055 if $State eq "Nebraska"; $StateSalesTaxRate = 0.0685 if $State eq "Nevada"; $StateSalesTaxRate = 0 if $State eq "New Hampshire"; $StateSalesTaxRate = 0.07 if $State eq "New Jersey"; $StateSalesTaxRate = 0.05125 if $State eq "New Mexico"; $StateSalesTaxRate = 0.04 if $State eq "New York"; $StateSalesTaxRate = 0.0475 if $State eq "North Carolina"; $StateSalesTaxRate = 0.05 if $State eq "North Dakota"; $StateSalesTaxRate = 0.0575 if $State eq "Ohio"; $StateSalesTaxRate = 0.045 if $State eq "Oklahoma"; $StateSalesTaxRate = 0 if $State eq "Oregon"; $StateSalesTaxRate = 0.06 if $State eq "Pennsylvania"; $StateSalesTaxRate = 0.105 if $State eq "Puerto Rico"; $StateSalesTaxRate = 0.07 if $State eq "Rhode Island"; $StateSalesTaxRate = 0.06 if $State eq "South Carolina"; $StateSalesTaxRate = 0.04 if $State eq "South Dakota"; $StateSalesTaxRate = 0.07 if $State eq "Tennessee"; $StateSalesTaxRate = 0.0625 if $State eq "Texas"; $StateSalesTaxRate = 0.0595 if $State eq "Utah"; $StateSalesTaxRate = 0.06 if $State eq "Vermont"; $StateSalesTaxRate = 0.053 if $State eq "Virginia"; $StateSalesTaxRate = 0.065 if $State eq "Washington"; $StateSalesTaxRate = 0.06 if $State eq "West Virginia"; $StateSalesTaxRate = 0.05 if $State eq "Wisconsin"; $StateSalesTaxRate = 0.04 if $State eq "Wyoming"; return($UnitPrice*(1+$StateSalesTaxRate)); } Main();
没有启用Perl的严格的编译指示,你甚至会得到相同的输出:
100 106.0 100 105.0
但是严格打开,当你运行这个Perl脚本时,你会得到下面的错误信息:
Global symbol "$StateSalesTexRate" requires explicit package name at line 37. Execution aborted due to compilation errors.
这两个例子中的问题是其中一个计算行中存在拼写错误。 我有“StateSalesTexRate”而不是“StateSalesTaxRate”为密歇根州的线路计算销售税。 Perl会明确地find并压扁这个bug。 与此同时,Python摇头,看起来是另一种方式。
这是一个大问题。 想象一下,您的在线业务正在使用该软件来计算您向客户的信用卡收取的费用。 需要多长时间才能认识到密歇根州的客户正在获得销售税的通行证? 当你这样做的时候,你会回到客户身边,说“对不起,我们需要更多的钱”,或者你自己吃亏了?
当然,任何使用这种编码algorithm来计算销售税的公司可能都有更大的问题。 但是通过这个例子你可以清楚地看到Perl中的严格编译指令是什么,以及为什么我和其他人相信它应该是任何脚本语言的基本特征。
有很多我喜欢Python的东西。 我明白为什么有些人更喜欢Python到Perl。 但是有一些我真正厌恶Python的东西。 这是一。
运行Python并打开警告:
python -W all file.py
回应:
有没有什么我应该为我的Python脚本日常工作?
我认为确保你的代码符合PEP 8通常是一个好主意。 正如在另一个答案中提到的那样,你可以通过编程来做到这一点:
pip install pep8 && pep8 file.py
LeoNerd提供了一个很好的解释,为什么在Python中没有“严格使用”或“使用警告”。
回答:
有没有什么我应该为我的Python脚本日常工作?
您可能有兴趣通过静态代码分析器(如pylint)和/或代码格式检查(如pep8)来运行代码。
他们可以帮助find潜在的问题,并标记警告。 他们也有很多关于你的代码的格式,你可能会或可能不感兴趣。
这是他们使用的一个体面的理由。 和相关的Stackoverflow问题在这里和这里 。
没有任何等价物。 随着时间的推移,Python的devise已经发展,并且已经做出了许多改变(特别是在3.x中),以确保默认语言中的默认值是开发人员想要的。 一个function存在是非常罕见的,但是是一个可选的标志。
这可能归结为Python的禅宗 “应该有一个 – 而且最好只有一个 – 明显的做法”。 Python的devise主要集中在可读性方面,并且有很多方法来做事情,或者改变语言的工作方式,使代码更难读。
我认为最接近的是在Python的旧版本中从__future__
导入,以将较新版本的某些修补程序/新function引入旧版本(例如默认从整数到浮点除法的部分)。 这与在标准情况下将缺省行为改进为更明智的意义上类似。
编辑:我似乎已经从perl用户看到这篇文章作为对Perl的攻击而感到愤怒 – 它从来没有打算这样做。 Perl是一个很好的语言,我的原始文章只是使用不好的措辞,并不清楚它的解释。 我试图澄清。