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

时间:2010-06-03 13:19:10

标签: python indentation

Whitespace是Python中的意思,因为代码块是由它们的缩进定义的。

此外,Guido van Rossum建议每个缩进级别使用四个空格(参见PEP 8: Style Guide for Python Code)。

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

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

11 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:10)

我刚刚在tutor@python.org邮件列表中遇到的另一个案例 - 一个使用Python工作的盲人程序员使用读者程序 - 显然读者程序并不是非常喜欢多个空格,所以对他来说更容易使用单个空间。

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

答案 4 :(得分:4)

Joel的Best Software Writing反义词始于Ken Arnold的有趣且具有挑衅性的文章“Style is Substance”,来自Ken的帖子,你也可以阅读here。这是一篇有争议的论文,我引用了这篇论文,“从我们所处的地方到我们不再担心风格的地方的唯一方法是将其作为语言的一部分加以执行”。

这是我读过的唯一一篇文章,提出语言的编译器应该锁定每个方面的风格(例如,关于锁定缩进量的想法将是其中的一部分) - 不仅仅是在Python中,或者...... Ken过去的主要贡献是Jini,curses,javaspaces,rogue和Corba的部分内容,没有与Python相关的内容。它确实很好,在网络版的评论中你可以看到一些对立点(唉,不一定同样有争议)。

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

total count = 1 000 000

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

当然,样式灵活性总是存在错误风险,例如,在Fortran案例中,

DO 10 I = 1. 5

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

DO 10 I = 1, 5

从这里循环五次到第10行(我相信现实世界中出现像这样的错误 - 点而不是逗号会彻底改变代码的含义 - 一旦损坏了太空任务,但不要'回想起确切的细节。)

所以,请不要将Fortran作为支持或反对“锁定”的一个例子,因为在许多风格方面,它是如此令人难以置信地松散

锁定的一些例子包括现代语言,例如案例约定并使它们强制执行语言的一部分(类的大写首字母等) - 我相信Ruby至少会警告这一点,如果你(例如)命名一个初始小写的类或者一个其他语言实际上会给编译器错误非类的,大写的。我认为由此产生的强制一致性是一件好事,我不明白为什么它应该是不同的,因为风格的强制方面是间距而不是套管等等。呃,阿诺德大部分都说服了我这个; - )。< / p>

答案 5 :(得分:1)

虽然通过在单个块中要求一致缩进来产生影响,但是通过使块之间的缩进级别相同或不同,可以产生 no 含义。换句话说,重点是什么?

将它与空白要求进行比较并不是真正有效,因为空格是Python语法的一部分:它定义了范围。只要范围可以明确定义,为什么我们要关心用多少空格来定义它?强迫每个人使用一些(完全任意的)固定数量的空间会带来什么好处?

如果您的文字处理程序强制您将段落缩进四个空格怎么办?这会很烦人,而且没有任何意义。它不应该用于具有固定数量的缩进空间的目的。

以这种方式思考:Python没有“空白”要求,因为它要求您找到一种无需大括号定义范围的方法。什么是空白,并说它有一个'空白要求'比说它有'范围定义没有括号'的要求更容易和更明显,所以为了简洁的沟通,我们只是说它有一个'空白要求'; - )

答案 6 :(得分:1)

Python就是快速原型制作。许多优秀的设计只能起作用,因为大多数Python程序员都有良好的实践。这就是为什么我们不像Java那样依赖访问器和变换器,我们可以访问带负数的数组索引。

在我看来,将空格限制为4并禁止选项卡并不能使Python在大规模上更具可读性。长期以来,由于我们倡导的良好做法,很少有问题。

我真的相信它。

Python带来了便利。

答案 7 :(得分:1)

reindent.py更改任何python文件以使用4空格缩进而不使用硬标签字符。 拥有这个方便的实用程序可以避免强迫其他人编程的需要 4空间风格的Python。

PS。 Perl,Java,C程序员花费很多脑循环来解决分号语法错误。语法绒毛浪费的每个脑循环都是一个不用花钱解决实际编程问题的循环。 Python快速开发的优势之一是它最大限度地减少了最终浪费脑循环的语法规则。因此,语法要求越少越好。

答案 8 :(得分:1)

除了上面给出的原因之外,还有另一个非常好的理由,为什么你希望解释器支持最小的缩进:节省空间。由于冻结Python字节码的限制,仅使用.pyc文件而不是实际代码运送东西并不总是可行的。这意味着如果您编写代码以在空间非常有限的平台上运行(例如,OpenWRT路由器),那么将空间数量保持在最小值以节省磁盘空间是非常有意义的。

这就是我写pyminifier

的原因

答案 9 :(得分:0)

Python在空白和换行方面非常重要,已经与其他语言不同了。它是该语言的一个独特部分,当然非常干净,但我认为添加这种限制会降低灵活性。

另外,我喜欢两个空格....我将被迫用两个空格编写我的程序,然后通过空间倍增器脚本运行它们作为编译步骤。

答案 10 :(得分:0)

避免make要求在每个操作前面都有制表符字符时出现的问题。

例如,如果您的标签等于四个空格并且您从.c文件和Makefile

来回轻弹,则会很痛苦