为什么Python使用不寻常的三重引号作为注释?

41 投票
5 回答
68405 浏览
提问于 2025-04-16 23:34

为什么Python不使用像C/C++/Java那样的传统注释风格呢:

/**
 * Comment lines 
 * More comment lines
 */

// line comments
// line comments
//

这是有特别原因的吗,还是说只是随便选择的?

5 个回答

25

三重引号不是注释。它们是可以跨多行的字符串字面量,而且会把这些换行符也包含在最终的字符串里。这让你可以使用

somestr = """This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is\
 significant."""

而不是

somestr = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."
54

很多回答提到了许多要点,但没有完整地解释事情是怎么运作的。简单总结一下……

# 注释是Python用来写注释的方式(和bash以及其他一些语言类似)。Python的注释只能写到行的末尾,没有像javascript那样的多行注释包裹(比如/* .. */)。大多数Python的开发环境允许你选择一段代码并注释掉,这也是很多人处理这种情况的方法。

接下来是普通的单行Python字符串:它们可以用'"引号(比如'foo'"bar")。这些字符串的主要限制是不能跨多行。这就是多行字符串的用途:它们是用三重单引号或三重双引号包围的字符串('''"""),只有在找到匹配的未转义结束符时才会结束。它们可以写很多行,并且可以包含所有中间的空白字符。

这两种字符串类型都定义了一个完全正常的字符串对象。它们可以被赋值给变量,可以进行运算等。一旦解析后,这些格式之间没有区别。不过,根据字符串的位置和使用方式,有两个特殊情况……

首先,如果一个字符串只是写下来了,没有进行其他操作,也没有赋值给变量,那它会发生什么呢?当代码执行时,这个裸字符串基本上会被丢弃。因此,人们发现用多行字符串注释掉大量Python代码是很方便的(前提是你要转义任何内部的多行字符串)。这并不常见,也不是语义上正确的做法,但它是被允许的。

第二种用法是,任何紧接在def Foo()class Foo()或模块开始后的裸字符串,会被视为该对象的文档字符串,并存储在该对象的__doc__属性中。这是字符串看起来像“注释”的最常见情况。不同的是,它们在解析的代码中扮演着积极的角色,存储在__doc__中……而且与注释不同的是,它们可以在运行时被读取。

106

在Python中,注释并不是用三重引号来写的。注释是用井号(也叫做“井字符”)来表示的:

# this is a comment

三重引号其实是用来写文档字符串的,跟注释不一样,它在程序中是可以当作真正的字符串来使用的:

>>> def bla():
...     """Print the answer"""
...     print 42
...
>>> bla.__doc__
'Print the answer'
>>> help(bla)
Help on function bla in module __main__:

bla()
    Print the answer

其实并不一定要用三重引号,只要是字符串就可以。使用"""只是一个约定(而且它的好处是可以写多行内容)。

撰写回答