为什么Python每个缩进级别不需要四个空格?

kno*_*orv 12 python indentation

空格是Python的意思,因为代码块是由它们的缩进定义的.

此外,Guido van Rossum建议每个缩进级别使用四个空格(参见PEP 8:Python代码样式指南).

在每个缩进级别上不需要四个空格的原因是什么?有技术原因吗?

似乎所有可以用于制作空格定义代码块的参数也可以用于参数来设置一个缩进级别(比如四个空格)的精确空白长度.

Dan*_*ach 29

没有技术原因.修改Python解释器以使每个缩进级别只需要四个空格就不会太难.

以下是其他缩进级别的一个用例:在交互式解释器中键入时,使用单空格缩进非常方便.它节省了打字,更容易正确计算空格数,可读性不是主要问题(因为代码甚至没有保存在文件中).


Way*_*ner 10

我刚刚在tutor@python.org邮件列表中遇到的另一个案例 - 一个使用Python工作的盲人程序员使用读者程序 - 显然读者程序并不十分喜欢多个空格,因此他更容易使用单一空间.

真正没有任何好的或技术上的理由要求正好4个空格,我认为反对要求的最佳论点是程序员不喜欢被限制,特别是通过愚蠢和有些武断的规则.当然我们都同意4个空格是最好的,我们大多数编辑都会自动设置我们的缩进,但是在你不想使用4个空格 - 一个关闭脚本代码等的情况下 - 你现在已经疏远了一个感觉到的程序员任意(风格)要求的压榨手.

由于一些原因,对于大多数人来说,空白的重要性不是问题.首先,我想不出一个(好的)程序员会认为正确的代码格式化是一件坏事.其次,逻辑要求我们将代码分成块.许多语言都使用{}分隔符.在装配中它通常是标签.Python的空白选择实际上是相当自然的,至少对于英语而言.当你读一本书,一份报纸或一篇博文时,当某人做出引用时,它通常会缩进.段落用空格或两行分隔.章节通常在页面末尾用空格分隔,在下一个开头用空格分隔.所以空白是一件好事,但迫使程序员坚持你的 特定的标准将让程序员用他们的时间去做别的事情.

  • 如果Python需要4个空格(或7个或其他),我们甚至不需要这个讨论.通过强加语言风格来避免风格讨论是一件好事.正如你所说:一个apt程序员可以读取7个空格缩进代码以及4个空格缩进代码,那么为什么不强迫每个人使用4呢? (2认同)

for*_*ran 6

使用1个空格(或制表符)可节省代码打高尔夫球的空间:-p


Ale*_*lli 5

Joel 的最佳软件写作选集始于 Ken Arnold 有趣且具有煽动性的文章“风格就是实质”,您也可以在此处阅读 Ken 的帖子。这是一篇论据充分的论文,我引用了这一点,“从我们所处的位置到达我们不再担心风格的地方的唯一方法是将其作为语言的一部分来强制执行”。

这是我读过的唯一一篇文章,建议语言的编译器应该锁定风格的每个方面(例如,你关于锁定缩进量的想法将是其中的一部分——不仅仅是在 Python 中,也...... . Ken 过去的主要贡献是 Jini、curses、javaspaces、rogue 和部分 Corba,与 Python 无关)。它提出了非常好的观点,在在线版本的评论中,您可以看到一些对立的观点(唉,不一定同样有充分的争论)。

我确实发现一位响应者谈论“Fortran 及其强大的格式规则”具有讽刺意味;这听起来像是一个从未使用过 Fortran 的人,或者使用它的人对它的理解非常浅薄。你知道多少种语言可以写,例如,

total count = 1 000 000
Run Code Online (Sandbox Code Playgroud)

……?在 Fortran 中,您可以!空格是不相关的,并且被编译器忽略,在标识符和数字文字中,因此您不必使用下划线或驼峰字母来使多字标识符可用(只需在单词之间使用空格!)并且很容易使大数字可读也。一些语言确实采用了这种规则,但大多数语言都禁止在标识符和数字中使用空格。

当然,样式灵活性总是伴随着错误的风险,例如,在 Fortran 的情况下,

DO 10 I = 1. 5
Run Code Online (Sandbox Code Playgroud)

DO10I数字 1.5分配给变量,而几乎无法区分

DO 10 I = 1, 5
Run Code Online (Sandbox Code Playgroud)

从这里到第 10 行在块上循环五次(我相信现实世界中会发生这样的错误——点而不是逗号彻底改变了代码的含义——一旦破坏了太空任务,但不记得确切的细节)。

所以,请不要以 Fortran 为例,无论是支持还是反对“锁定”,因为在许多风格方面,它非常松散

锁定的一些例子包括现代语言,它们采用例如大小写约定并使它们成为语言的强制部分(类的大写首字母等)——我相信 Ruby 至少会警告这一点,而其他一些语言实际上会给出编译器错误(例如) 用小写首字母命名类或用大写字母命名非类。我认为由此产生的强制一致性是一件好事,我不明白为什么在强制的样式方面是间距而不是大小写等情况下它应该有所不同。IOW,阿诺德在这一点上几乎说服了我;-)。