Python:为什么要使用4个空格进行缩进?

90

在编写Python代码时,我只使用2个空格进行缩进,虽然PEP-8推荐使用4个空格,但从历史上来看,这对我来说并不习惯。

那么,有人能说服我改用4个空格而不是2个吗?有哪些优缺点?

P.S. 最后,将现有的所有代码库从2个空格转换为4个空格的简单方法是什么?


P.P.S. PEP-8还严格建议不要使用制表符进行缩进。在这里阅读


因此,总结如下:

优点:

  • 在字符串超过80行时,有更多的空间进行排列。
  • 可以从片段中复制代码并使其正常工作。

缺点:

  • 对于嵌套语句的深度级别越深,实际代码可用空间就越小。

谢谢。


8
你需要将这个设为社区 Wiki,否则它可能会被关闭。这是一个高度争议的话题,每个人都有自己的观点。 - MitMaro
@AI:本应是两个独立的问题。 - MitMaro
4
这是高度主观的,而且是一个观点问题。当然,正确的观点(;))是每个人都应该使用制表符,以便根据编辑器偏好自由地调整间距。 - Quentin
26
我认为没有任何理由关闭这个问题。他正在询问一个合法的编程问题,因为程序不仅需要编写还需要被阅读。而且主观性并不影响问题的重要性。 - Daniel C. Sobral
如果你遵循Ruby指南,你会使用两个空格,因为那是一群狂热者决定的 :) 我可以想象,你可以编写一个Python脚本来读取你的Python代码,并很容易地将两个空格替换为四个空格... - BenDundee
显示剩余4条评论
13个回答

152

其他人都使用4个空格。这是我接受的唯一使用4个空格的原因。在我的心里,我仍然想使用制表符(每缩进一个制表符,有意义吧,它与其他空格分开缩进)。我不在乎制表符可以以不同的宽度显示,因为那没有语法上的差别。最糟糕的情况是一些注释可能不对齐。可怕!)但我已经接受了,因为Python社区作为一个整体使用4个空格,所以我也使用4个空格。这样,我就可以从其他人编写的代码片段中组装代码,并且一切正常。


34
这样,我可以从其他人编写的代码片段中组装代码,而且它们都能正常运行... 而且看起来和感觉就像是 我的 代码 :) - xtofl
24
许多人在这个话题上声称标签是唯一的解决方案,因为你可以将它们设置为任何宽度... 这很好,直到由于新的标签计算方式导致连续行分散到各个位置,或者您的右边距溢出...我在过去的一年里一直在处理其他语言中继承的代码,这使我非常喜欢回到通常相当均匀缩进的Python代码。 - zigg
3
除了之前购买过许可证外,我与Sublime Text没有关联。但我发现使用 'tab_size'=4 来设置 Python 的自定义偏好非常有用,对于其他语言(如JavaScript等),将默认的 'tab_size'=2 - Antony
2
我和你一样,Markus :) 当最终的差异非常小的时候,接受现状就是与严谨挂钩的界限。 - Micha Mazaheri
2
初学者经常会问一个常见的问题:“我应该缩进多少个空格?”根据官方的Python风格指南(PEP 8),你应该使用4个空格进行缩进。(有趣的是:Google内部的风格指南规定要使用2个空格进行缩进!) - michael
显示剩余2条评论

90

我喜欢使用四个空格缩进函数的内部代码,因为def加一个空格刚好是四个字符。

def·foo():
····pass

45
我喜欢三个空格可以很好地缩进if语句内部的代码,因为if加上一个空格正好是三个字符。 - Alexander Shukaev

66

我认为真正的问题是为什么用空格而不是制表符。

制表符明显更好:

  • 它几乎使得缩进不一致变得不可能(我曾见过代码通常有4个空格缩进,但某些部分恰好少了一个空格,这很难通过简单的检查来确定是7个还是8个空格...这在使用制表符时是不会发生的,除非你将制表符设置为1个空格)。
  • 制表符是一个逻辑上的语义表示缩进,它允许您(和其他任何开发人员)选择显示尽可能多的"空格"(或列),而不会影响其他人的偏好。
  • 如果您手头只有“记事本”(或其他虚拟编辑器),它也需要更少的按键
  • 添加和删除制表符是一个对称的操作。大多数IDE在按Tab键时可能会自动插入4个空格,但通常在按回退键时只会删除1个空格(取消缩进操作仍然可以使用shift-tab组合键),或者您可以使用鼠标点击缩进的中间部分并删除一个字符。
  • 它们只占用1个字节,而不是4个字节(将其乘以数千行,您可以节省几KB!:p)。
  • 您少了一件需要达成一致的事情,因为如果您决定使用空格,则讨论重新开始选择多少个空格(尽管共识似乎在四个左右)。

使用空格的优点:

  • Guido喜欢它们。
  • 您不能轻松地在此键入制表符,它会转移焦点(虽然您可以粘贴一个)。

2
我喜欢你说的那种转移注意力的方式。 - Gibbs
空格在不同平台上的渲染效果也是相同的。 - ggorlen
在我看来,这个答案并没有真正经得起时间的考验。现代IDE可以在按下tab键时插入一个制表符或一个制表符的空格,并且不仅可以配置多少空格为一个制表符,还可以在两种约定之间进行转换。而且,大小点相当小,除非你的电脑上有数百万行Python代码,或者担心部署存储(在这种情况下,这就是缩小实用程序的作用)。 - Abion47
@Abion47,我试过的每个集成开发环境都按照我描述的方式工作,TAB键会插入配置的空格数量,但是当按下DEL键或将光标定位在缩进的中间时,很容易破坏一致性(BACKSPACE键的行为因IDE而异)... 尽管有“:p”,你没有理解我在节省空间评论中的讽刺,并不能说明太多问题。 - undefined
@fortran 关键不在于现代集成开发环境完全消除了制表符的优点,而是它们处理制表符的方式使得不使用它们几乎没有任何痛苦。例如,如果你经常发现自己按DEL键或将光标定位在缩进的中间,那么要么是你的编码习惯有些奇怪,要么是你没有充分利用Shift+Tab。至于关于节省空间的评论的讽刺尝试并不站得住脚,因为有很多制表符支持者在毫无讽刺的情况下提出了这个确切的论点。 - undefined

18

"更好的"缩进并不存在。这是一个宗教性的圣战话题。四个空格的缩进是不错的选择,因为它足以清晰地表明缩进,但不会让整个屏幕几乎都是空白,使你必须水平滚动才能阅读一半的代码。

此外,它还有一个优点,就是在历史上定义的“制表符”方面相当于“半个制表符”。

除此之外,使用任何你的团队喜欢的方式。就像巧克力和香草一样。

切换的简单方法是使用支持制表符和空格制表符的编辑器。将所有前导空格制表符转换为制表符,将制表符大小设置为四,然后将前导制表符转换回空格制表符。

使用Python脚本也很容易实现。只需计算所有前导空格的数量,然后将同样数量的空格添加到行开头并重新写出即可。


我们在Emacs中也做了同样的事情。这样程序员就可以看到他们喜欢的间距,而不会强加给其他人。 - Kelly S. French
我知道这是一个非常古老的答案,但我想反驳“没有更好的缩进”的说法。正如@fortran的答案中列出的原因(以及我可以想到的*许多其他原因),制表符显然是更好的缩进方式,我对空格作为缩进仍然存在感到沮丧。实际上,我唯一能想到的空格优势是某些文本框在编写在线代码时会自动缩进,并且空格更容易输入(这是荒谬的,因为在输入多个空格后,它已不再是情况,而且Tab键远非程序员使用的最困难的键)。 - dallin
我认为,对于代码清晰度而言,使用4个空格比2个空格更加客观。至少对我来说,如果一行新的未缩进的代码与哪些代码对齐是很难判断的,除非在缩进级别中只有几行代码。此外,最近我患上了一种影响眼睛和视觉处理的遗传病,这使得这一点变得更加困难,也成为了一个无障碍问题。 - dallin

16

PEP并不是你的上司。如果你已经一直使用2个空格进行缩进,那么没有理由改变所有代码以符合它。如果你真的认为它非常重要,可以从现在开始遵循它,但坦白说,我并不认为如此。最好根据使你(和同事)在阅读和编写方面感到最舒适的习惯去进行。


1
同意。为你的代码制定自己的约定。我在任何语言中都使用2个空格,因此对我来说,我的所有代码都是一致的。采用外星人代码样式指南(例如PEP),但要根据自己的需求进行调整。每个缩进4个空格是水平空间的愚蠢浪费,那些发明这种约定的人应该去买每个人顶级分辨率的显示器,如果他们非常喜欢这种约定。 - Alexander Shukaev

7
任何好的编辑器(如emacs、vim)都会为您抽象出这个完整的无聊过程。它可以同样适用于空格或制表符,并且可以配置为使用任意数量的空格(或制表符的任意数量的空格宽度)。它也可以在不太麻烦的情况下在不同格式之间进行转换(请参见vim中的:retab命令)。
如果您正在尝试批量转换源代码格式,我建议您查看indent实用程序。
话虽如此,我还是忍不住回答另一个问题……我一直偏爱制表符,因为它可以绕过整个问题,每个人都可以根据自己的喜好设置源代码的宽度。当您在不帮助转换的编辑器中工作时,这也可以减少很多打字。至于2个空格和4个空格的区别,那纯粹是外观问题。

6
此外,其中一个原因是:当您有一些超过80个字符的长行并想要将其分成两部分时,您只能缩进一个空格,这有点令人困惑。
if code80symbolslong and somelongvariablegoeshere and somelongerthan80symbols \
 and someotherstatementhere:
  # some code inside if block
  pass

if code80symbolslong and somelongvariablegoeshere and somelongerthan80symbols \
  and someotherstatementhere:
    # some code inside if block
    pass

11
你不应该这样做。如果你的缩进是四个空格,那么你就不应该有少于四个空格的缩进。在我看来,“and”这一行应该比“if”这一行多缩进两个级别。 - TimK

5

如果你是唯一在源文件上工作的程序员,并且没有强制执行特定风格的编码标准,那么可以使用你熟悉的任何风格。就我个人而言(也符合我们的编码标准),我使用硬制表符,这样查看代码的人可以使用自己的偏好。

要进行更改,只需要将每行开头的空格更改为两倍大小即可。有许多方法可以实现这一点;在 Vim 文本编辑器中,我可以想到两种方法:首先:

:%s/^\(\s\{2}\)\+/\=repeat(' ', len(submatch(0))*2)

这是一个简单的正则表达式,用于查找行首一个或多个空格对,并将其替换为两倍数量的空格。可以通过打开vim并执行以下命令来扩展到所有文件:

vim *.py

(或相应的标签),后跟(未经测试):

:argdo %s/^\(\s\{2}\)\+/\=repeat(' ', len(submatch(0))*2)/ | w

或者:

" Switch to hard tabs:
:set noexpandtab
" Set the tab stop to the current setting
:set tabstop=2
" Change all spaces to tabs based on tabstop
:retab!
" Change the tab stop to the new setting
:set tabstop=4
" Go back to soft tabs
:set expandtab
" Replace all the tabs in the current file to spaces
:retab

当然,许多其他工具也会提供类似的功能:如果像“sed”、“awk”、“perl”或“python”这样的工具不能轻松实现这一点,我会感到惊讶。

5
缩进和一般的编码风格标准因语言和项目而异。采用编码风格标准的原因是为了使代码看起来统一,无论谁写的都一样。这可以提高项目的可读性,而且说实话,看起来更好。
采用编码风格标准时不应只考虑个人喜好。编码标准之所以存在,正是因为人们的偏好各不相同,如果让每个人随心所欲地写,就会导致混乱,对所有人都不利。
如果你只是为自己编写代码,没有人会阅读,那么随便写吧。否则,遵循社区接受的标准将使你的代码更易于被其他人接受。还要记住,如果你决定在未来向社区贡献代码,如果你已经习惯了他们的编码风格,那么你将更容易地融入其中。
至于更改制表符大小,有很多支持Python的源代码格式化程序,大多数程序员编辑器和IDE也具备此功能。你可能已经有了它,只需要查阅你正在使用的编辑器的文档即可。

2

使用4个空格更容易在视觉上识别长嵌套的代码块,有助于调试节省时间。


同意。对于像C这样的语言,我实际上更愿意使用两个,但在C中,缩进提供的视觉提示不如Python中重要。 - user1071847

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接