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

Har*_*ons 69 python conventions pep8 indentation

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

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

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


PPS PEP-8还建议不要使用标签进行缩进.在这里阅读


所以,总结一下:

优点:

  • 包裹超过80行的字符串时有更多的空间来安排.
  • 可以从代码片段中复制代码,它只是起作用.

缺点:

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

谢谢.

Mar*_*kus 112

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

  • "这样,我可以从其他人编写的片段中汇编代码,而且一切正常......"它的外观和感觉都是_my_代码:) (25认同)
  • 有很多人在这个主题上声称标签是唯一真正的解决方案,因为你可以将它们设置为你想要的任何宽度......这是很好的,直到延续线最终显示在整个地方因为新方式标签是计算好了,或者你的右边距溢出......过去一年我用其他语言的继承代码处理了大量的内容,这让我更加喜欢花时间回归到一般非常均匀的缩进蟒蛇. (13认同)
  • 我与Sublime Text没有任何关系(除了后来买了许可证),但是我发现用'tab_size'= 4`为python设置自定义首选项非常有用,对于其他语言默认`'tab_size'= 2` (像JavaScript等). (2认同)
  • 我不能再和你在一起了@Markus :) 当差异最终很小的时候接受现状是与迂腐划清界限的原因。 (2认同)
  • “初学者问的一个常见问题是,“我应该缩进多少个空格?”根据官方 Python 风格指南 (PEP 8),你应该缩进 4 个空格。(有趣的事实:Google 的内部风格指南规定缩进 2 个空格! )" — https://developers.google.com/edu/python/introduction?csw=1#indentation (2认同)

Ion*_*tan 69

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

def·foo():
····pass
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这样一个事实:三个空格字符很好地缩进了`if`语句的内部代码,因为`if` +一个空格会产生三个字符. (8认同)

for*_*ran 45

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

标签显然更好:

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

空间的优点:

  • 圭多喜欢他们.
  • 您无法在此处轻松键入选项卡,它会转移焦点(尽管您可以粘贴一个).

  • 我喜欢你所说的转移焦点的方式. (2认同)

Chr*_*her 14

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

它还具有与"标签"的历史定义相关的"半标签"的优点.

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

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

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


Pes*_*sto 12

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


rme*_*dor 7

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

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

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


DrA*_*rAl 5

如果您是处理源文件的唯一编码员,并且没有强制执行特定样式的编码标准,请使用您喜欢的任何编码标准。就个人而言(并且符合我们的编码标准),我使用硬标签,以便查看代码的人可以使用他们自己的偏好。

要进行更改,您只需将所有行首空格更改为两倍大的空格。有很多方法可以做到这一点;在 Vim 文本编辑器中,我可以想到两个:首先:

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

这是一个简单的正则表达式,它在行的开头查找一对或多对空格,并用两倍于找到的空格替换它们。它可以扩展为通过打开 vim 来处理所有文件:

vim *.py
Run Code Online (Sandbox Code Playgroud)

(或等价物),后跟(未经测试):

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

或者:

" 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
Run Code Online (Sandbox Code Playgroud)

当然,许多其他工具将提供类似的功能:如果像、或 之类的东西不能很容易地做到这一点sed,我会感到惊讶。awkperlpython


Dan*_*ral 5

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

采用编码风格标准时有一个无效的原因:因为您喜欢它。编码标准的存在正是因为人们的偏好不同,如果放任自流,混乱就会随之而来,损害所有人的利益。

如果您只是为自己编写代码,而没有人会阅读,那么请继续编写您喜欢的任何代码。否则,遵循社区公认的标准将使您的代码更容易被其他人接受。还要记住,如果您决定将来向社区贡献代码,如果您已经习惯了他们的编码风格,那么您会更轻松。

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


Har*_*ons 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
Run Code Online (Sandbox Code Playgroud)

  • 你不应该这样做.如果你的缩进是4个空格,你应该永远不会有小于那个的缩进.在我看来,"和"行应缩进比"if"行多两个级别. (5认同)