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


77

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

那么,谁能说服我使用4个空格而不是2个空格?有什么优缺点?

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


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


因此,总结一下:

优点:

  • 包裹长度超过80行的字符串时,有更多的空间可以布置。
  • 可以从摘要中复制代码,并且可以正常工作。

缺点:

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

谢谢。


7
您将要使其成为社区Wiki,否则可能会关闭。这是一个值得商de的话题,每个人都有自己的见解。
MitMaro

@MitMaro:我同意这是非常主观的。尽管值得注意的是PS部分是一个有效的问题。
DrAl

@AI:应该是两个单独的问题
MitMaro

3
这是非常主观的,也是有见地的。当然,正确的见解(;))是每个人都应使用标签,以便他们可以根据自己的喜好使用编辑器首选项来分隔内容。
昆汀

19
我认为没有任何理由可以结束这个问题。他在问一个合理的编程问题,因为程序既要阅读又要编写。主观并不会变得那么重要。
Daniel C. Sobral

Answers:


127

其他所有人使用4个空格。这是使用我遇到并接受的4个空格的唯一原因。在我的心脏,我仍然想使用标签(每个缩进1个压印字符,是有道理的,不是吗?独立缩进与其他的空格。我不关心标签可以显示为不同的宽度,这使得任何语法差异,最差可能发生的是某些注释未排成一行。这很恐怖!)但是我已经接受了,因为python社区整体上使用4个空格,所以我使用4个空格。这样,我可以从其他人编写的摘录中汇编代码,并且一切正常。


29
“通过这种方式,我可以从别人编写的摘录中汇编代码,并且一切正常……”,它的外观和感觉与我的代码一样:)
xtofl

17
关于此主题的很多人都声称制表符是一个真正的解决方案,因为您可以将其设置为所需的任意宽度...太好了,因为制表符的新方式可以使连续行最终散布到各处计算出来的,或者您的边距溢出了……在过去的一年中,我一直在用其他语言的继承代码处理大量此类问题,这使我很讨厌花时间回到通常相当一致的缩进上蟒蛇。
zigg 2012年

2
我不隶属于Sublime Text(不久前购买了许可证),但是我发现'tab_size' = 4仅对python设置自定义首选项非常有用,而'tab_size' = 2对其他语言(如JavaScript等)则使用默认设置是非常有用的。
安东尼2012年

2
@Markus我不能再和您在一起了。)当差异最终非常小时接受现状,这就是腐。
Micha Mazaheri

1
“初学者经常问的一个问题是,“我应该缩进多少个空格?”根据官方Python样式指南(PEP 8),您应该缩进4个空格。(有趣的是:Google的内部样式指南规定缩进2个空格! )”- developers.google.com/edu/python/introduction?csw=1#indentation
迈克尔,

75

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

def·foo():
····pass

23
而且我喜欢这样的事实,三个空格字符很好地缩进了if语句的内部代码,因为if+一个空格可以使三个字符。
亚历山大·舒卡耶夫

54

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

选项卡显然更好:

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

空间优势:

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

2
我喜欢您所说的转移焦点的方式。
Gibbs 2015年

17

没有“更好的”缩进。这是一个宗教圣战主题。四个是不错的选择,因为它足以使缩进变得清晰,但并不能使整个屏幕大部分都是空白,并且您必须水平滚动才能读取一半的程序。

与“标签”的历史定义相比,它还具有“半标签”的优点。

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

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

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


我们在Emacs中做了同样的事情。这样,程序员就可以看到他们喜欢的间距,而不必强加给其他人。
凯利·S·法兰西

14

PEP不是您的老板。如果已经一致缩进了2个空格,则没有理由更改所有代码以使其符合规范。如果您真的认为它至关重要,那么可以继续进行下去,但是坦率地说,我不是。最好采用任何约定为您(和您的同事)提供最大的阅读和书写舒适度。


1
同意 为您的代码制定自己的约定。无论语言是什么,我到处都使用2个空格,因此对我来说,我的所有代码都是一致的。遵循一些外来的代码风格指南,例如PEP,并根据需要进行调整。每个压痕有4个空间是对水平空间的愚蠢的浪费,如果发明这种方法的人应该非常喜欢这种惯例,那么他们应该去购买每个高分辨率显示器。
亚历山大·舒卡耶夫

7

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

如果您要批量转换源格式,建议您看一下indent实用程序。

就是说,我无法拒绝回答其他问题...我的偏好始终是制表符,因为它绕过了整个问题,每个人都可以按自己认为合适的宽度查看源代码。当您在对转换无济于事的编辑器中工作时,它的键入也少得多。至于2个空间还是4个空间,这纯粹是装饰性的。


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

7
你不应该那样做。如果您的缩进为4个空格,则切入的缩进不得少于该空格。在我看来,“和”行应比“ 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,我会感到惊讶。awkperlpython


3

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

采用编码样式标准无效的原因有一个:因为您喜欢它。编码标准之所以存在,恰恰是因为人们的偏好各不相同,如果任由自己选择,就会造成混乱,损害所有人。

如果您自己编写代码,没人会读过,请继续编写并随便编写。否则,遵循您的社区公认的标准将使您的代码更容易被其他所有人接受。还要记住,如果您将来决定要向社区贡献代码,那么如果您已经习惯了他们的编码风格,那么您将有一个更轻松的时间。

至于更改选项卡的大小,有很多支持Python的源代码格式化程序,大多数程序员的编辑器和IDE也具有此功能。您可能已经拥有了,这只是参考所用编辑器的文档即可。


1

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

现在,我很确定某些人仍然对最大嵌套数量有不同意见。


1

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


同意 实际上,对于像C这样的语言,我宁愿使用两种语言,但是在C中,缩进所提供的视觉线索并不像Python中那样重要。
user1071847

1

如果您想与其他程序员一起编写python代码,如果您使用其他缩进作为它们,则将成为一个问题。大多数Python程序员倾向于使用4空间缩进。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.