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

时间:2009-07-14 14:12:45

标签: python indentation conventions pep8

在编写python时,我只使用2个空格进行缩进,确定PEP-8确实建议有4个空格,但从历史上看,这是不寻常的。

那么,任何人都可以说服我使用4个空格而不是2个空格吗?有什么优点和缺点?

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


P.P.S。 PEP-8还建议不要使用标签进行缩进。 read here


所以,总结一下:

优点:

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

缺点:

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

感谢。

13 个答案:

答案 0 :(得分:106)

其他人都使用4个空格。这是使用我遇到并接受的4个空格的唯一原因。在我的心里,我仍然想要使用标签(每个缩进1个缩进字符,有意义,没有?与其他空格分开缩进。我不关心标签可以显示作为不同的宽度,没有语法差异。可能发生的最糟糕的是一些评论不排队。恐怖!)但我已经接受了,因为整个python社区使用4个空格,我使用4个空格。通过这种方式,我可以从其他人编写的片段中汇编代码,并且一切正常。

答案 1 :(得分:68)

我喜欢这样一个事实:四个空格字符可以很好地缩进函数的内部代码,因为def +一个空格会产生四个字符。

def·foo():
····pass

答案 2 :(得分:39)

我认为真正的问题是为什么空格而不是标签。

标签显然更好:

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

空间的优点:

  • Guido喜欢他们。
  • 您无法在此处轻松输入标签,它会转移焦点(尽管您可以粘贴一个标签)。

答案 3 :(得分:14)

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

对于“标签”的历史定义,它还具有“半标签”的优点。

除此之外,请使用您的小组喜欢的任何内容。这就像巧克力和香草。

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

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

答案 4 :(得分:11)

PEP不是你的老板。如果它已经是一致的2空格缩进,则没有理由改变所有代码以符合它。如果你真的认为它至关重要,你可以继续前进,但是,坦率地说,我没有。无论你在阅读和写作方面为你(和你的同事)提供最舒适的约定,你最好还是去。

答案 5 :(得分:7)

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

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

那就是说,我无法拒绝回答另一个问题......我的偏好一直是标签,因为它绕过了整个问题,每个人都可以按照他们认为合适的宽度设置来查看源代码。当你在编辑器中工作时,它的输入也很少,而这些编辑器对转换它没有帮助。至于2比4空间,这纯粹是装饰性的。

答案 6 :(得分:5)

另外一个原因是:当你有一些长行(超过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

答案 7 :(得分:4)

如果您是唯一一个处理源文件的编码器,并且没有强制执行特定样式的编码标准,请使用您认为合适的任何内容。就个人而言(并符合我们的编码标准),我使用硬标签,以便无论谁看到代码都可以使用自己的偏好。

要进行更改,您只需将所有行首空格更改为两倍大的空格。有很多方法可以做到这一点;在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

当然,许多其他工具都会提供类似的功能:如果sedawkperlpython之类的内容无法做到这一点,我会感到惊讶容易。

答案 8 :(得分:3)

标识和通用编码风格标准因语言,项目而异。采用编码风格标准有一个原因:无论是谁编写代码,代码看起来都是统一的。这提高了项目的易读性,而且直言不讳地说,它看起来更好。

采用编码风格标准时,有一个原因是无效的:因为你喜欢它。编码标准的存在恰恰是因为人们的偏好不同,如果留给他们自己,就会产生混乱,从而损害所有人的利益。

如果您正在为自己编写代码,没有人会阅读,请继续编写任何您喜欢的代码。否则,遵循您所接受的社区标准将使您的代码更加适合其他人的眼睛。并且还要记住,如果您决定将来为社区贡献代码,那么如果您已经习惯了他们的编码风格,那么您将有更轻松的时间。

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

如果你想和其他程序员一起编写python代码,那么如果你使用不同的缩进就会成为一个问题。 大多数Python程序员倾向于使用4空间缩进。

答案 11 :(得分:1)

通过4个空格可以直观地识别长嵌套代码块。调试时节省时间。

答案 12 :(得分:0)

使用4个空格或2个空格完全取决于您。 4个空间只是一个惯例。最重要的是,不要混合标签和空格。使用空格键