如何在Python中创建多行注释?

1406

如何编写多行注释?大多数语言都有块注释符号,例如:

/*

*/

4
我想,作为一种解释型语言,就像sh、bash或zsh一样,使用#作为注释的唯一方式是有道理的。我猜这样做可以让Python脚本更容易被解释。 - Victor Zamanian
1
我知道这个答案很旧,但我遇到了同样的问题才找到它。接受的答案确实有效,尽管我不太了解Python的细节,也不知道为什么它可能不正确(根据ADTC的说法)。 - Brandon Barney
7
让我向您解释这个问题。被接受的答案使用''', 实际上创建了一个没有作用的多行字符串。技术上讲,那不是注释。例如,你可以写k = '''假注释,真字符串'''。然后,打印(k)来看看ADTC是什么意思。 - pinyotae
3
现在我理解得多清楚了。我习惯使用 VBA,其中创建未使用的字符串会导致错误。我没有意识到 Python 只是忽略它。这仍然适用于调试和学习,但对于实际开发来说不是一个好的做法。 - Brandon Barney
在Python源代码中,如果您打破了一行长代码,编辑器会自动缩进它,以显示该断行实际上是前一行的一部分。如果我要打破一行伪代码,那么我应该这样做吗? - alpha_989
显示剩余3条评论
27个回答

2142

您可以使用三引号字符串。当它们不是文档字符串(类/函数/模块中的第一件事)时,它们将被忽略。

'''
This is a multiline
comment.
'''

(请确保适当缩进前导'''以避免IndentationError。)

Python的创造者Guido van Rossum将此称为"专业提示"在推特上发表了这个消息

然而,Python的样式指南PEP8更喜欢使用连续的单行注释,就像这样:

# This is a multiline
# comment.

这也是许多项目中的常见做法。文本编辑器通常都有一个快捷方式,可以轻松地完成此操作。


31
我明白了。您在Python脚本“test.py”中放置了一个大的多行字符串,只是为了测试。当您执行“import test”时,将生成一个“test.pyc”文件。不幸的是,“pyc”文件非常大,并且将整个字符串作为纯文本包含其中。我是否有所误解,或者这条推文是错误的? - unutbu
28
如果文件中只有这个东西,那么它就是文档字符串。在它前面加些代码,它将会从.pyc文件中消失。我编辑了答案,并将“模块”添加到具有文档字符串的事物列表中。 - Petr Viktorin
43
我不喜欢将多行字符串用作注释。语法高亮会将它们标记为字符串而不是注释。我喜欢使用一个不错的编辑器,可以在我输入时自动处理注释掉的区域和换行的多行注释。当然,这是个人口味问题。 - Sven Marnach
66
作为惯例,我发现使用 """ 表示函数文档字符串,而使用 ''' 表示块注释会更有帮助。这样可以在您通常的文档字符串周围包裹 ''' ,而不会冲突。 - Roshambo
25
您可以将多行字符串用作多行注释,但令人惊讶的是,这些答案中没有一个提到PEP 8子章节,该章节专门建议使用连续的单行注释构造多行注释,并使用空白的 # 行来区分段落。 - Air
显示剩余23条评论

103

Python确实有多行字符串/注释语法,除非用作文档字符串,多行字符串不会生成任何字节码——就像 # -前缀的注释一样。实际上,它的作用与注释完全相同。

另一方面,如果你说这种行为必须在官方文档中记录才能成为真正的注释语法,那么,是的,你可以说它不能作为语言规范的一部分得到保证。

无论如何,你的文本编辑器也应该能够轻松地注释掉所选的区域(通过在每行前面放置一个#)。如果没有,请切换到一个支持此功能的文本编辑器。

在没有某些文本编辑功能的情况下编写Python可能会很痛苦。找到合适的编辑器(并知道如何使用它)可以极大地改善Python编程体验。

文本编辑器不仅应该能够注释掉所选区域,还应该能够轻松地移动代码块,并在按下Enter键时自动将光标放置在当前缩进级别。代码折叠也可能很有用。


为了防止链接失效,这里是Guido van Rossum的推文的内容:

@BSUCSClub Python小贴士:您可以将多行字符串用作多行注释。除非用作文档字符串,否则它们不会生成代码!:-)


3
三引号('''')确实可以用来表示多行注释。 - Varun Bhatia
你也应该考虑使用一个集成开发环境(IDE)。是的,它们比较庞大,但如果使用得当,它们可以真正提高编码效率。我个人曾经使用过PyDev,现在则使用PTVS(与Visual Studio一起)。我绝对推荐PTVS,因为它非常好用,包含了上述功能以及更多 - 与virtualenvs的直接集成,以及非常出色的调试功能,不言而喻。 - Sbspider
@ADTC:鉴于Petr Viktorin的回答,我编辑了我的回答,写成“Python确实有多行字符串/注释语法”。 - unutbu
2
@HappyLeapSecond 我认为你应该澄清一下,说“Python没有真正的多行注释语法,但支持可以用作注释的多行字符串。” - ADTC
3
我希望有一种简单的方法在测试时注释掉整个代码块。其他编程语言做得很容易,但是Python很麻烦。请为我翻译这段内容。 - Albert Godfrind
显示剩余5条评论

71

从被接受的答案中得知...

你可以使用三引号字符串。当它们不是文档字符串(类/函数/模块中的第一件事)时,它们会被忽略。

这个说法并不准确。与注释不同,无论三引号字符串出现在源代码的哪个位置,它们仍然会被解析,并且必须语法正确。

如果您尝试运行此代码...

def parse_token(token):
    """
    This function parses a token.
    TODO: write a decent docstring :-)
    """

    if token == '\\and':
        do_something()

    elif token == '\\or':
        do_something_else()

    elif token == '\\xor':
        '''
        Note that we still need to provide support for the deprecated
        token \xor. Hopefully we can drop support in libfoo 2.0.
        '''
        do_a_different_thing()

    else:
        raise ValueError

你将会得到以下两种结果之一...

ValueError: invalid \x escape

...在Python 2.x或者...

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 79-80: truncated \xXX escape

本文介绍如何在 Python 3.x 中进行多行注释,以被解析器忽略的方式实现。

唯一的方法是...

elif token == '\\xor':
    # Note that we still need to provide support for the deprecated
    # token \xor. Hopefully we can drop support in libfoo 2.0.
    do_a_different_thing()

然后,您可以使用 r'原始字符串' -- r'\xor' == '\\xor' - GingerPlusPlus
3
任何“真正的”多行注释都必须被解析并且在语法上有效。例如,C语言风格的注释不能包含*/,否则会终止该块注释。 - user1919238
2
@dan1111 这很明显,注释不能包含结束标记,但这是唯一的限制。 - el.pescado - нет войне
18
“注释”有更多的限制。您只能注释掉整个语句,而不能注释掉表达式的部分。例如,在C语言中,您可以注释掉一些列表元素:“int a[] = {1, 2, /3, 4,/ 5};”。但是使用多行字符串,您不能这样做,因为那将把一个字符串放在您的列表中。 - el.pescado - нет войне

41

在Python 2.7中,多行注释的写法为:

"""
This is a
multilline comment
"""

如果你正在一个类中,你应该适当地进行缩进。

例如:

class weather2():
   """
   def getStatus_code(self, url):
       world.url = url
       result = requests.get(url)
       return result.status_code
   """

25
三重引号是一种插入不执行任何操作的文本的方法(我相信您也可以使用普通的单引号字符串来实现这一点),但它们并不是注释——解释器实际上会执行该行代码(但该行不会做任何事情)。这就是为什么三重引号“注释”的缩进非常重要的原因。 - Demis
17
这个解决方案是错误的,weather2 的注释实际上是docstring,因为它是类中的第一件事情。 - Ken Williams
同意@KenWilliams的观点。这不是正确的解决方案。尝试将其放在函数/类的中间,看看它如何破坏您的格式化和自动折叠/代码整理。 - alpha_989

29

5
这是不正确的,参见使用三重引号的回应。 - Fernando Gonzalez Sanchez
12
这并不是错的。可以将“多行字符串作为注释”的做法形容为一个“专业技巧”。官方Python文档中没有提到此方法,因此OP才会发帖询问。 - Sanjay T. Sharma
9
这是有关文档字符串的PEP;该页面上没有提到“注释”一词。 - Sanjay T. Sharma

18

在Python中并没有多行注释的功能,#是注释单行代码的唯一方法。 许多人将''' a comment '''作为他们的解决方案。

看起来它可以工作,但在Python中,'''会将其包含的行视为常规字符串,解释器不会像使用#注释那样忽略它。

请查阅官方文档


1
这应该是被接受的答案。 - Eliav Louski

16

我认为它不会影响到代码,除非是多行字符串。然而,大多数Python集成开发环境都有一个快捷键可以“注释掉”多行代码。


14

如果您在{{代码}}中添加注释

"""
long comment here
"""

在脚本中间,Python / linters将无法识别。折叠将混乱不堪,因为上面的注释不是标准建议的一部分。最好使用

# Long comment
# here.

如果你使用Vim,你可以使用像commentary.vim这样的插件,通过按下Vjgcc自动注释掉长行注释。其中Vj选择两行代码,gcc将它们注释掉。
如果你不想使用上述的插件,你可以使用搜索和替换。
:.,.+1s/^/# /g

这将用#替换当前和下一行的第一个字符。


10

Visual Studio Code是一款通用的官方多行注释切换工具,类似于Xcode的快捷键。

在macOS上选择代码块然后按+/

在Windows上选择代码块然后按Ctrl+/


7

不幸的是,字符串化并不总是可以用作注释!因此,更安全的做法是使用标准方法,在每行前加上#

下面是一个例子:

test1 = [1, 2, 3, 4,]       # test1 contains 4 integers

test2 = [1, 2, '''3, 4,'''] # test2 contains 2 integers **and the string** '3, 4,'

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