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

13

在Python中,空格具有特殊的意义,代码块由缩进定义。

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

那么,为什么没有要求每个缩进级别都必须使用恰好四个空格呢?是否存在任何技术原因?

似乎可以使用所有支持使空格定义代码块的论点来支持为一个缩进级别设置固定的空格长度(例如四个空格)。


5
为什么要限制?Python从来不是一门限制程序员的语言。 - Xavier Ho
14
Xavier: 那不是一个Perl的参数吗? :-) 来自“Python之禅”的一句话:“做事应该有且只有一种明显的方法。” - knorv
5
对于像我们这样喜欢饮用苏打水的人,怎么办呢? - Pharaun
2
@knorv:Python 喜欢直觉和可读性。干净的代码就像设计模式一样被发现。它们很好知道,但不是强制执行的。Python 的设计旨在帮助实现这一点——即尽可能保持一致性。但我现在要快速回答一下。 - Xavier Ho
1
@Xavier:我知道在网页等方面使用空格更有意义,但是我使用VIM,并且根据我的工作需要将制表符设置为2或4个空格,所以我喜欢制表符带来的灵活性。 - Pharaun
显示剩余4条评论
11个回答

31

没有技术上的原因。修改Python解释器以要求每个缩进级别恰好四个空格并不太难。

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


11

我在 tutor@python.org 邮件列表中遇到了另一个例子 - 一位盲人程序员正在使用 Python,使用阅读器程序 - 显然阅读器程序不太喜欢多个空格,因此使用单个空格对他来说更容易。

实际上没有好的或技术上的理由要求使用恰好 4 个空格,我认为反对这种“要求”的最好论据是程序员不喜欢被限制,尤其是被愚蠢和有些武断的规则所限制。当然我们都同意使用 4 个空格是最好的,并且大多数人都会让编辑器自动设置缩进,但是在某些场合下你并不想使用 4 个空格 - 例如一次性脚本代码等 - 这时你就已经让一个感觉受到任意(风格)要求限制的程序员感到疏远了。

对于大多数人来说,空格的重要性并不是问题,因为有几个原因。首先,我想不出一个好的程序员会认为适当的代码格式化是一件坏事。其次,逻辑需要我们将代码分成块。许多语言使用 {} 分隔符。在汇编语言中通常使用标签。Python 选择使用空格实际上相当自然,至少对于英语来说是这样。当你阅读书籍、报纸或博客文章时,有人引用时通常会进行缩进。段落用一个或两个空行分隔。章节通常在页面末尾和下一页的开头使用空白隔开。因此,空格是一件好事,但是强制程序员遵守“你”的特定标准将使程序员去做其他事情。


2
如果Python需要4个空格(或7个、或其他),我们甚至不需要进行这种讨论。通过施加语言风格来避免风格讨论是很好的。正如您所说:一个合适的程序员可以读取7个空格缩进代码以及4个空格缩进代码,那么为什么不强制每个人都使用4个空格呢? - xtofl
我从未考虑过那个问题。他/她是否制作了一个将4个空格缩进转换为1个空格缩进的脚本,反之亦然?我想听到“空格空格空格空格def class…”会很烦人。 - Xavier Ho
@Xavier:是的,他有 - 我不记得是脚本还是他只是使用了编辑器功能。 - Wayne Werner
听到这样的故事真是太好了。我记得 Stack Overflow 上还有另一个成员因为手指疼痛而无法打字,所以他使用并训练了 Dragon NaturallySpeaking 来进行编码。显然,这种方法非常有效。 - Xavier Ho
1
@Xavier:我总是很喜欢听到那些被认为是“残疾”的人在克服身体/精神上的限制,享受我们许多人视为理所当然的活动。如果我最终进入学术界,我肯定会在这个领域进行大量研究。 - Wayne Werner


6
使用1个空格(或制表符)可以在代码高尔夫中节省空间 :-p。

5
Joel的最佳软件写作选集以Ken Arnold的有趣而引人入胜的文章“风格即实质”为开头,你也可以在Ken的博客这里读到更多内容。这是一篇很有说服力的论文,其主题是,“从我们现在所处的地方到不再担心风格的地方唯一的方法就是将其作为语言的一部分强制执行”。
这是我读过的唯一一篇提出编译器应该锁定每个风格方面的文章(例如,您关于锁定缩进量的想法将成为其中的一部分——不仅仅是在Python中… Ken的主要过去贡献是Jini、curses、javaspaces、rogue和Corba的部分,与Python无关)。它提出了非常好的观点,在在线版本的评论中,您可以看到一些反对意见(遗憾的是,不一定同样有说服力)。
我确实发现有一个回复者谈到了“Fortran及其强大的格式规则”,这听起来像是一个从未使用过Fortran或对其有非常肤浅和边缘的理解的人。你知道有多少种语言可以这样写,例如:
total count = 1 000 000

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

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

DO 10 I = 1. 5

将数字1.5赋值给变量DO10I,而几乎难以区分的

DO 10 I = 1, 5

这个循环从这里到第10行执行5次(我相信在现实生活中,像这样的一个错误——用点代替逗号会严重改变代码的含义——曾经破坏了一次太空任务,但我不记得确切的细节)。

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

一些锁定的例子包括现代语言采用例如大小写约定并将其作为语言的强制部分(类的大写首字母等)——我相信Ruby至少会警告这一点,而其他一些语言实际上会给出编译器错误,如果您使用小写字母或大写字母命名非类。我认为结果强制统一是一件好事,我不明白为什么在强制样式方面与大小写、间距等不同。换句话说,Arnold大多数已经说服了我;-)。


在https://dev59.com/k3I-5IYBdhLWcg3wqqTh#1740152中,您充分阐述了对大小写敏感性的反对意见。那么,您是否希望Python采用样式锁定,其中该样式为全大写字母(或全小写字母)? - unutbu
@unutbu,实际上我需要按照特定的大写风格编程(在工作中:我们有并强制执行风格指南),尽管我不会觉得始终使用全大写比Fortran早期更易读,但我发现小写加下划线比驼峰式更可取。 (这是谷歌类和函数的风格)。 当然,这都是非常假设的。;-) - Alex Martelli

1

虽然在单个块中要求一致的缩进有其含义,但是在块之间具有相同或不同的缩进级别并没有任何含义。换句话说,这有什么意义呢?

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

如果您的文字处理器强制您缩进段落恰好四个空格怎么办?这很烦人,而且毫无意义。强制使用固定数量的缩进空格不应该有任何作用。

这样想吧:Python没有'空白'要求,而是要求您找到一种方法来定义没有大括号的范围。从中得出的是空格,并且说它具有'空白要求'比说它具有'无大括号的范围定义'要更容易和更明显,因此为了简洁明了的目的,我们只说它具有'空白要求' ;-)


1

Python 的优势在于快速原型设计。大量精良的设计之所以有效,是因为大部分 Python 程序员都有良好的编程习惯。这就是为什么我们不像 Java 那样过多地依赖访问器和变异器,并且可以使用负数访问数组索引。

在我看来,将空格限制为 4 个并禁止制表符并不能使 Python 在大规模情况下更易读。由于我们提倡良好的编程实践,因此长期以来几乎没有出现过任何问题。

我真诚地相信这一点。

Python 带来方便。


1

reindent.py 可以将任何 Python 文件更改为使用 4 个空格缩进和无硬制表符。 拥有这个方便的实用程序可以避免强迫其他人以 4 个空格的样式编写 Python。

PS. Perl、Java 和 C 程序员花费了很多脑力来处理分号语法错误。每一个浪费在语法琐事上的脑力都是没有用于解决真正编程问题的脑力。Python 的一个优点是快速开发,它最小化了会浪费脑力的语法规则。因此,较少的语法要求比更多的要求更好。


1
我不确定我理解你的回答。如果你将文件重新缩进为4个空格,实际上你确实强制后续查看源代码的人使用4个空格缩进...除非你在提交之前将其改回来。 - viraptor
@viraptor:有一些工具(如unexpand)可以将空格转换为制表符。因此,如果有人真的想使用以制表符缩进的Python,他们也有办法这样做。 - unutbu

1
除了上述原因之外,还有一个非常好的理由让解释器支持最小缩进:节省空间。由于冻结Python字节码的限制,仅使用.pyc文件而不是实际代码来运行某些东西并不总是切实可行的。这意味着,如果您正在编写要在非常有限的空间(比如OpenWRT路由器)上运行的代码,将空格数量保持最少可以节省磁盘空间,这是非常明智的选择。
这就是为什么我写了pyminifier的原因。

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接