然而关于注释的规范,这个话题就像我们之前聊过的缩进、终止符和命名办法一样,众口难调。

注释符常日可分为两种,即行注释与块注释(inline/block),它们在不同的编程措辞中的符号可谓让人眼花缭乱。

比如行注释符,它至少有以下的 17 种之多(出自维基百科):

php注释符Python 为什么用  号作注释符 GraphQL

个中两个最大的阵营分别是“//”与“#”号:

// 注释符:ActionScript, C (C99), C++, C#, D, F#, Go, Java, JavaScript, Kotlin, Object Pascal (Delphi), Objective-C, PHP, Rust, Scala, SASS, Swift, Xojo# 注释符:Bourne shell and other UNIX shells, Cobra, Perl, Python, Ruby, Seed7, Windows PowerShell, PHP, R, Make, Maple, Elixir, Nim

那么,Python 为什么用“#”号作注释符,而不是“//”呢?

这个问题恐怕没办法从解析的效率、符号的辨识度和输入的便利性等方面回答,由于它们基本上没有差异。

我没有找到官方的阐明,但是从这些注释符的阵营中,已经弗成贵出一个较为合理的阐明:

// 注释符基本上被 C 措辞家族所用# 注释符则基本上是被 Shell 和其它脚本措辞所用

Python 在创造之初,从 C 和 Shell 措辞中借鉴了不少东西,但它是一种脚本措辞,因此在注释符这个最为根本的措辞要素上,就倾向了脚本措辞的传统。

在某些“类脚本措辞”中,比如 yaml、conf 和 ini 等格式的配置文件,它们大多也是采取脚本措辞的“#”号作为注释符。

以是,Python 行内注释符的选择,大概可以归结为一种历史缘故原由,即借鉴了 Shell 脚本措辞的写法。

比较于行注释符的多样,块注释符更加是让人眼花缭乱:

大多数写法是我从未见过的,有些乃至是难以忍受的,槽点太多!

在这份表格里,我们看不到 Python,由于从严格意义上讲,Python 并没有块注释符!

一样平常而言,我们在连续的每行内容前面加“#”号,达到块注释的效果。
块注释被看作是多个行注释。

PEP-8 中是这么建议的:

Each line of a block comment starts with a # and a single space (unless it is indented text inside the comment).

有人曾在 Twitter 上发问,为什么 Python 没有块注释符?

Guido 回答称,可以将多行字符串用作块注释:

Python 的多行字符串用三对单引号或双引号表示,它还可以用作文档字符串(即Documentation Strings,简写docstrings)。

但是,将它当做多行注释符利用,在语义上则有点怪怪的——它表示的是一段字符串,虽然没有赋值给变量,不会天生代码,但是它并非语义上的注释。

由于脚本措辞的特性,它许可我们写一段“无根的字符串”,在语法上没有问题,也没有负浸染(negative effects),但是,如果把它作为注释利用,这便是一种副浸染(side effects)了。

从这点上考虑,我虽然不反对有人把多行字符串写法用作块注释,但是我会更推举大家利用“#”号作注释。

其余,对付无用的代码,最好的做法便是直接删除,如果后续创造有须要,再回退修正。
详细的多行注释只管即便放在文档字符串中,这样在核心代码中就会很少涌现多行注释的情形了。

对付 Python 的注释符用法,大家是怎么想的呢?欢迎留言互换。

写在末了:本文属于“Python为什么”系列(Python猫出品),该系列紧张关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。
若你有其它感兴趣的话题,欢迎填在《Python的十万个为什么? 》(https://mp.weixin.qq.com/s/jobdpO7BWWON0ruLNpn31Q) 里的调查问卷中。