为什么python使用非常规的三引号来评论?

时间:2011-08-14 14:44:03

标签: python coding-style comments

为什么python不使用传统的评论风格,如C / C ++ / Java使用:

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

// line comments
// line comments
//

是否存在具体原因或是否随意?

5 个答案:

答案 0 :(得分:80)

Python不会对注释使用三引号。注释使用哈希(a.k.a.磅)字符:

# this is a comment

三重引用的东西是doc string,与评论不同,它实际上是作为程序的真实字符串提供的:

>>> 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

使用三重引号并不是严格要求,只要它是一个字符串即可。使用"""只是一种约定(并且具有多线的优点)。

答案 1 :(得分:41)

许多答案都有很多要点,但不能完全了解事情是如何运作的。总结一下......

# comment是Python执行实际注释的方式(类似于bash和其他一些语言)。 Python只有“到行尾”的注释,它没有明确的多行注释包装(而不是javascript的/* .. */)。大多数Python IDE允许您一次选择并注释一个块,这是有多少人处理这种情况。

然后有正常的单行python字符串:他们可以使用'"引号(例如'foo' "bar")。这些的主要限制是它们不会包裹多行。这就是多行字符串的用途:这些是由三个单引号或双引号('''""")包围的字符串,仅在找到匹配的未转义终结符时终止。他们可以根据需要继续使用尽可能多的行,并包括所有插入的空格。

这两种字符串类型中的任何一种都定义了一个完全正常的字符串对象。可以为它们分配变量名称,将运算符应用于它们等。一旦解析,任何格式之间都没有差异。但是,有两种基于的特殊情况字符串是什么以及它是如何使用的......

首先,如果一个字符串刚刚写下来,没有应用额外的操作,并且没有分配给变量,它会发生什么?代码执行时,基本上丢弃了裸字符串。因此人们发现使用多行字符串注释掉大量的python代码很方便(允许你转义任何内部多行字符串)。这不是常见的,或者在语义上是正确的,但允许的。

第二个用法是在def Foo()class Foo()或模块的开头之后立即跟随的任何此类裸字符串被视为包含文档的字符串该对象,并存储在对象的__doc__属性中。这是最常见的情况,其中字符串看起来像是“评论”。不同之处在于, 作为已解析代码的一部分执行活动角色,存储在__doc__中......与注释不同,它们可以在运行时读取。

答案 2 :(得分:17)

三重引号不是评论。它们是string literals,跨越多行,并在结果字符串中包含这些换行符。这允许您使用

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."

答案 3 :(得分:5)

大多数脚本语言都使用#作为注释标记,因此要自动跳过shebang(#!),它指定要运行解释程序的程序加载程序(如#!/ bin / bash)。或者,可以指示解释器自动跳过第一行,但是将#定义为注释标记更方便,就是这样,因此它被跳过了。

答案 4 :(得分:0)

Guido-Python的创建者,实际上在这里关注该主题: https://twitter.com/gvanrossum/status/112670605505077248?lang=en

总结-对于多行注释,只需使用三引号即可。出于学术目的-是的,从技术上讲,它是一个字符串,但由于从未使用过或未分配给变量而被忽略了。