我在Stack Overflow和PEP 8上看到,建议是仅将空格用于Python程序中的缩进。我能理解保持一致的缩进的必要性,我已经感到痛苦。
是否存在首选空间的根本原因?我本以为使用选项卡要容易得多。
我在Stack Overflow和PEP 8上看到,建议是仅将空格用于Python程序中的缩进。我能理解保持一致的缩进的必要性,我已经感到痛苦。
是否存在首选空间的根本原因?我本以为使用选项卡要容易得多。
Answers:
答案是在PEP中给出的[ed:此段落已于2013年编辑]。我引用:
缩进Python 的最流行方法是仅使用空格。
您还需要其他哪些根本原因?
坦率地说:如第一段所述,还要考虑PEP的范围:
本文档给出了Python代码的编码约定,该Python代码包含主Python发行版中的标准库。
目的是使正式python发行版本中的所有代码都保持一致的格式(我希望我们可以同意这是普遍适用的Good Thing™)。
由于对于单个程序员而言,空格和制表符之间的决定是a)确实是个问题,并且b)可以通过技术手段(编辑器,转换脚本等)轻松解决,因此有一种明确的方法可以结束所有讨论:选择一个。
Guido是一个可供选择的人。他甚至不必给出理由,但他仍然通过引用经验数据来做到这一点。
对于所有其他目的,您可以将此PEP作为建议,也可以忽略它-您的选择,团队的选择或团队的领导者。
但是,如果我能给您一个建议:请不要混合使用它们;-) [ed:不再使用制表符和空格混合。]
好吧,似乎每个人都强烈偏爱空间。我专门使用制表符。我很清楚为什么。
标签实际上是一个很酷的发明,来到后空格。它使您可以缩进而无需数百万次按空格或使用伪造的制表符(产生空格)。
我真的不明白为什么每个人都在区别使用制表符。这很像老年人歧视年轻人,因为他们选择了更新的更有效的技术,并且抱怨脉冲拨号在每部电话上都有效不仅在这些花哨的新。“音调拨号并非在所有电话上都有效,这就是为什么它是错误的”。
您的编辑器无法正确处理标签?好吧,请一位现代编辑。也许该死的时代,我们现在处于21世纪,而编辑器是高科技复杂软件的时代已经过去很久了。现在,我们有无数的编辑者可供选择,所有这些人都支持选项卡。另外,您可以定义制表符应该有多少,而空格则无法做到。看不到标签?那是什么意思呢?好吧,您也看不到空格!
我可以这么大胆地建议找一个更好的编辑器吗?这些高科技产品之一,已经在10年前发布了,它们显示了看不见的字符?(嘲讽)
使用空格会导致更多的删除和格式化工作。这就是为什么(以及所有其他知道这一点并同意我的人)使用Python的选项卡的原因。
制表符和空格的混合是不行的,对此也不存在任何争论。那是一团糟,永远无法正常工作。
我个人不同意制表符上的空格。对我而言,制表符是文档布局的字符/机制,而在代码情况下,空格用于表示命令之间的内容或命令之间的轮廓。
我必须同意吉姆(Jim)的评论,即制表符并不是真正的问题,这是人们以及他们想如何混合使用制表符和空格。
就是说,为了惯例起见,我强迫自己使用空格。我重视一致性而不是个人喜好。
空格的原因是选项卡是可选的。在标点符号中,空格是实际的最低公分母。
每个体面的文本编辑器都有一个“用空格替换选项卡”,许多人都使用它。但不总是。
尽管某些文本编辑器可能会用制表符代替一排空格,但这确实很少见。
底线。空格绝对不会出错。你可能会出差错的标签。因此,请勿使用制表符,以减少出错的风险。
制表符的问题在于它们是不可见的,人们永远无法就制表符的宽度达成共识。当您混合使用制表符和空格,并且将制表符设置为除Python之外的其他选项(每8个空格使用制表符)时,您将看到的代码布局与Python看到的布局不同。并且由于布局确定了块,因此您将看到不同的逻辑。它导致细微的错误。
如果您坚持要违反PEP 8并使用制表符-或更糟糕的是,混用制表符和空格-至少总是将python与'-tt'参数一起运行,这会使缩进不一致(有时是制表符,有时会为相同的缩进使用空格级别)的错误。另外,如果可能,将编辑器设置为以不同方式显示选项卡。但实际上,最好的方法是不要使用制表符。
混合制表符和空格时会出现缩进的主要问题。显然,这并不能告诉您应该选择哪一个,但这是推荐一个很好的理由,即使您是通过掷硬币来挑选它的。
但是,恕我直言,有一些较小的理由偏爱制表符而不是制表符:
不同的工具。有时代码会显示在程序员的编辑器之外。例如。发布到新闻组或论坛。在这里,空格通常比制表符更好-到处都会弄乱空格,制表符也是如此,但反之则不然。
程序员对源代码的看法有所不同。这是非常主观的-它要么是制表符的主要优点,要么是根据您所站在的那一侧来避免使用它们的原因。从好的方面来说,开发人员可以使用首选缩进方式查看源代码,因此更喜欢2空间缩进的开发人员可以与8空间开发人员在同一源代码上一起工作,并且仍然可以随意查看它们。不利的一面是,这给人带来了影响-有些人喜欢8空格,因为它提供了非常明显的嵌套嵌套的非常明显的反馈-他们可能会看到2-indenter检入的代码不断地包裹在编辑器中。让每个开发人员以相同的方式查看代码将导致行长度的一致性更高,以及其他一些问题。
续行缩进。有时您希望缩进一行以指示它是从上一行开始的。例如。
def foo():
x = some_function_with_lots_of_args(foo, bar, baz,
xyzzy, blah)
如果使用制表符,则无法在不混用空格和制表符的情况下,针对在编辑器中使用不同制表符的人们进行调整。这有效地扼杀了上述好处。
但是,显然,这是一个深切的宗教问题,编程受到困扰。最重要的问题是我们应该选择一个-即使那不是您喜欢的那个。有时,我认为显着缩进的最大优点是至少我们没有幸免放置牙套。
同样值得一读的是杰米·扎温斯基(Jamie Zawinski )的这篇文章。
请注意,使用制表符会混淆PEP 8的另一方面:
限制所有行最多79个字符。
假设,假设您使用2的制表符宽度,而我使用8的制表符宽度。编写所有代码,以使最长行达到79个字符,然后我开始处理文件。现在,我有一些难以阅读的代码,因为(如PEP所述):
大多数工具中的默认包装会破坏代码的视觉结构
如果我们都使用4个空格,那就总是一样。编辑器可以支持80个字符的宽度的任何人都可以轻松阅读代码。注意:80个字符的限制本身就是一场神圣的战争,因此,我们不要从这里开始。
任何不精简的编辑器都应该有一个使用空格的选项,就好像它们是制表符一样(插入和删除),因此实际上不应是有效的参数。
问题的答案是:PEP-8希望提出建议,并决定由于空格更为流行,因此强烈建议在制表符上推荐空格。
关于PEP-8的注意事项
PEP-8说:“每个缩进级别使用4个空格。”
很明显,这是标准建议。
“对于不想弄乱的真正旧代码,您可以继续使用8位制表符。”
很明显,在某些情况下可以使用选项卡。
“切勿混用制表符和空格。”
明确禁止混用-我认为我们都对此表示同意。Python可以检测到这一点,并且经常使人窒息。使用-tt参数使它成为显式错误。
'缩进Python的最流行方法是仅使用空格。第二流行的方式是仅使用标签。
这清楚地表明两者都被使用。只是要非常清楚:您仍不应在同一文件中混用空格和制表符。
“对于新项目,强烈建议在选项卡上仅使用空格。”
这是一个明确的建议,是一个强有力的建议,但不是禁止使用制表符。
在PEP-8中,我找不到自己的问题的好答案。我使用的标签是我以前在其他语言中使用过的标签。Python接受使用制表符专用的源代码。对我来说足够了。
我以为我会尝试使用空间。在编辑器中,我将文件类型配置为仅使用空格,因此如果按Tab键,它将插入4个空格。如果按Tab键太多次,则必须删除空格! 啊! 删除次数是标签页的四倍!我的编辑器无法告诉我我为缩进使用了4个空格(尽管AN编辑器可以做到这一点),并且显然坚持每次删除一个空格。
难道不建议Python在读取缩进时将制表符视为n个空格吗?如果我们可以同意每个缩进4个空格和每个制表符4个空格并允许Python接受,则不会有问题。
我们应该找到双赢的解决方案。
当[人们]正在阅读代码时,当他们写完新代码时,他们会在打开新的作用域(或sexpr或其他东西)时关心代码倾向于缩进多少屏幕列...
...我的观点是,解决技术问题的最佳方法是强制要求ASCII#9 TAB字符永远不会出现在磁盘文件中:对编辑器进行编程,以将TAB扩展到适当数量的空格,然后再将行写入磁盘。 ..
...这假设您从未在制表符真正重要的地方使用过制表符,例如在字符串或字符常量中,但是我从不这样做:当重要的是制表符时,我总是使用'\ t'代替。
由于python依靠缩进来识别程序结构,因此需要一种明确的方法来识别标识。这就是选择空格或制表符的原因。
但是,python也有一个很强的哲学,即只有一种方法可以做事,因此应该正式建议一种缩进方法。
空格和制表符都给编辑人员处理缩进带来了独特的挑战。选项卡本身的处理在不同的编辑器甚至用户设置之间都不统一。由于空格是不可配置的,因此它们提供了更合乎逻辑的选择,因为它们可以保证结果在各个地方看起来都一样。
你可以吃蛋糕吃。设置编辑器以将选项卡自动展开为空格。
(:set expandtab
在Vim中。)
除了已经命名的所有其他原因(一致性,不要混用空格和制表符等)之外,我相信还有其他一些理由可以说明这4个空格约定。这些仅适用于Python(可能还有缩进有意义的其他语言)。根据个人喜好,其他语言的选项卡可能更好。
如果编辑器没有显示选项卡(根据配置的不同,发生的次数很多),那么另一位作者可能会假设您的代码使用4个空格,几乎所有可公开获得的Python代码都会使用4个空格。如果同一编辑器的制表符宽度为4,则可能会发生令人讨厌的事情-至少,那个穷人会因为遵循惯例而很容易避免的缩进问题而浪费时间。因此,对我而言,首要原因是避免具有一致性的错误。
回顾制表符或空格中哪个更好的问题,应该问一下制表符的优点是什么;我见过很多赞美标签的帖子,但很少有令人信服的论点。emacs,vi(m),kate等优秀的编辑器会根据您代码的语义进行适当的缩进-即使没有制表符也是如此;可以轻松地将相同的编辑器配置为在退格键等上缩进。
在决定代码的外观/布局的自由方面,有些人有很强的偏好。其他人则重视这种自由的一致性。Python通过指示将缩进用于块等来极大地降低了这种自由度。这可能被视为错误或功能,但选择Python会带来一些麻烦。就个人而言,我喜欢这种一致性-在开始为新项目进行编码时,至少布局与我惯用的布局非常接近,因此相当容易阅读。几乎总是。
使用空格进行缩进允许“布局技巧”,这些技巧可能有助于理解代码。PEP8中列出了其中一些示例;例如。
foo = long_function_name(var_one, var_two,
var_three, var_four)
# the same for lists
a_long_list = [1,
2,
# ...
79]
# or dictionaries
a_dict = {"a_key": "a_value",
"another_key": "another_value"}
当然,以上内容也可以写得很好
foo = long_function_name(
var_one, var_two,
var_three, var_four)
# the same for lists
a_long_list = [
1,
2,
# ...
79]
# or dictionaries
a_dict = {
"a_key": "a_value",
"another_key": "another_value"}
但是,后者占用了更多的代码行,并且有时认为更少的行会更好(b / c您可以在一个屏幕上得到更多)。但是,如果您喜欢对齐,则从某种意义上说,空格(最好由一个好的编辑器协助)在Python中为您提供了比制表符更多的自由度。[好吧,我猜有些编辑器允许您使用制表符执行相同的操作;)-但如果有空格,所有的编辑器都可以执行...]
回到其他人都提出的相同论点-PEP 8指示(好的,强烈建议)空格。当然,如果来到仅使用选项卡的项目,则别无选择。但是由于建立了PEP 8约定,几乎所有Python程序员都习惯了这种样式。这使得在大多数程序员都能接受的风格上达成共识变得容易得多,否则让个人对风格达成共识可能很难。
通常,帮助执行样式的工具无需费力即可了解PEP 8。这不是一个很好的理由,但是开箱即用就可以了。
制表符的普遍问题是它们在不同环境中的表示方式可能不同。
在给定的编辑器中,选项卡可能是8个空格,也可能是2个空格。
在某些编辑器中,您可以控制它,而在其他编辑器中,则不能。
制表符的另一个问题是它们在打印输出中的表示方式。我相信大多数打印机会将制表符解释为8个空格。
毫无疑问,有了空格。一切都会按照作者的意图排列。
关于Jim和Thomas Wouters之间的讨论。
问题是...因为制表符和空格的宽度都可以变化-并且由于程序员不能在这两个宽度上达成共识-为什么制表符要怪罪。
我同意吉姆的观点-制表符本身并不邪恶。但有个问题...
使用空格,我可以控制“我自己的代码” 世界上每个编辑器中外观。如果我使用4个空格-则无论您在哪个编辑器中打开我的代码,它与左边距的距离都是相同的。使用标签时,我受制于编辑器的标签宽度设置-甚至对于我自己的代码也是如此。我不喜欢那样
因此,即使空格不能保证一致性也确实如此-它们至少使您可以更好地控制OWN代码的外观-制表符无法做到。
我认为,这并不是使程序员更容易实现(并强加)空格的方法,而是程序员编写代码的一致性,而是显示代码的编辑器的一致性。