83

在编写 python 代码时,我只使用 2 个空格来缩进,当然PEP-8确实建议使用 4 个空格,但从历史上看,这对我来说并不常见。

那么,谁能说服我使用 4 个空格而不是 2 个空格?有什么好处和坏处?

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


PPS PEP-8 也严格建议不要使用制表符进行缩进。在这里阅读


所以,总结一下:

优点:

  • 当包裹超过 80 行的字符串时,有更多的空间来排列。
  • 可以从片段中复制代码,并且可以正常工作。

缺点:

  • 使用更深层次的嵌套语句,实际代码的空间更少。

谢谢。

4

13 回答 13

140

其他人使用 4 个空格。这是使用我遇到并接受的 4 个空格的唯一原因。在我心中,我仍然想使用制表符(每个缩进一个缩进字符,有意义,不是吗?将缩进与其他空格分开。我不在乎制表符可以显示为不同的宽度,这没有语法上的区别。最糟糕的可能发生的情况是一些评论没有对齐。恐怖!)但我已经接受了,因为整个 python 社区使用 4 个空格,所以我使用 4 个空格。这样,我可以从其他人编写的代码片段中组装代码,并且一切正常。

于 2009-07-14T14:20:53.333 回答
81

我喜欢四个空格字符很好地缩进函数的内部代码这一事实,因为 def + 一个空格使四个字符。

def·foo():
····pass
于 2009-07-14T14:30:32.553 回答
61

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

标签显然更好:

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

空间优势:

  • 圭多喜欢他们。
  • 您不能在此处轻松键入选项卡,它会转移焦点(尽管您可以粘贴一个)。
于 2009-07-14T14:22:45.903 回答
17

没有“更好”的缩进。这是一个宗教圣战话题。四个很好,因为它足以使缩进清晰,但不是那么多,你的整个屏幕大部分都是空白,你必须水平滚动才能阅读一半的程序。

它还具有作为“标签”历史定义的“半标签”的优势。

除此之外,使用你的团队喜欢的任何东西。这就像巧克力与香草。

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

使用 python 脚本也很容易做到。只需计算所有前导空格,然后将相同数量添加到行首并将其写回。

于 2009-07-14T14:20:22.227 回答
14

PEP 不是你的老板。如果它已经是一致的 2 空格缩进,则没有理由更改所有代码以符合它。如果您真的认为这很重要,您可以继续前进,但坦率地说,我没有。你最好遵循任何惯例,让你(和你的同事)在阅读和写作方面都感到最舒适。

于 2009-07-14T14:20:40.150 回答
7

任何体面的编辑器(emacs、vim)都会为你抽象出这整套废话。它同样适用于空格或制表符,并且可以配置为使用任意数量的空格(或任意数量的制表符空格宽度)。它还可以在不同的格式之间进行转换,而不用太麻烦(参见:retabvim 中的命令)。

如果您尝试批量转换源格式,我建议您查看indent实用程序。

也就是说,我忍不住要回答另一个问题……我的偏好一直是制表符,因为它绕过了整个问题,每个人都可以查看源代码,并设置他们认为合适的宽度。当您在对转换没有帮助的编辑器中工作时,打字也少了很多。至于 2 对 4 个空格,那纯粹是装饰性的。

于 2009-07-14T14:26:53.557 回答
6

原因之一是:当您有一些长行(超过 80 个符号)并且想要将其拆分为 2 时,您将只有 1 个空格可以缩进,这有点令人困惑:

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
于 2009-07-14T14:41:32.397 回答
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,我会感到惊讶。perlpython

于 2009-07-14T14:19:31.603 回答
3

标识和一般编码风格标准因语言、项目而异。采用编码风格标准的原因之一是:让代码看起来统一,无论是谁编写的。这提高了项目的易读性,坦率地说,它看起来更好。

采用编码风格标准时有一个无效的原因:因为你喜欢它。编码标准的存在正是因为人们的偏好各不相同,如果任其发展,就会出现混乱,损害所有人的利益。

如果你是一个人为自己编写代码,没人会读到,那就继续写你喜欢的任何东西。否则,遵循您所在社区公认的标准将使您的代码在其他人的眼中更容易接受。还要记住,如果你决定将来为社区贡献代码,如果你已经习惯了他们的编码风格,你会更轻松。

至于更改选项卡大小,有许多支持 Python 的源代码格式化程序,大多数程序员的编辑器和 IDE 也具有此功能。您可能已经拥有它,只需查阅您正在使用的编辑器的文档即可。

于 2009-07-14T14:20:10.417 回答
1

一个原因是,如果您使用较少的空格进行缩进,您将能够嵌套更多的语句(因为行长通常限制为 80)。

现在我很确定有些人仍然不同意有多少嵌套结构应该是最大值。

于 2009-07-14T14:29:15.863 回答
1

如果您想与其他程序员一起编写 python 代码,那么如果您使用与他们不同的缩进,就会出现问题。大多数 Python 程序员倾向于使用 4 空格缩进。

于 2009-07-14T16:49:29.497 回答
1

用 4 个空格更容易直观地识别长嵌套代码块。节省调试时间。

于 2010-02-22T18:00:48.933 回答
0

使用 4 个空格或 2 个空格完全取决于您。4个空格只是一个约定。最重要的是,不要混合制表符和空格。使用空格键

于 2009-07-14T14:25:51.470 回答