在Python中创建多行注释的方法?

Dun*_*ter 1081 python documentation comments python-2.7 python-3.x

我最近开始学习Python,但我找不到如何实现多行注释.大多数语言都有块注释符号

/* 

*/
Run Code Online (Sandbox Code Playgroud)

我在Python中试过这个,但它会抛出一个错误,所以这可能不是正确的方法.Python实际上是否具有多行注释功能?

Pet*_*rin 1691

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

'''
This is a multiline
comment.
'''
Run Code Online (Sandbox Code Playgroud)

(确保'''适当地缩进前导以避免IndentationError.)

Guido van Rossum(Python的创建者)在推文中称它为 "专业提示".

但是,Python的样式指南PEP8 倾向于使用连续的单行注释,这也是许多项目中的内容.编辑通常有一个快捷方式来轻松完成这项工作.

  • 作为一种惯例,我发现使用""""用于文档字符串和""用于块注释是有帮助的.通过这种方式,你可以在没有冲突的情况下围绕平常的文档字符串包装. (58认同)
  • 我不喜欢多行字符串作为评论.语法高亮将它们标记为字符串,而不是注释.我喜欢使用一个体面的编辑器来自动处理注释区域并在我键入时包装多行注释.当然,这是一个品味问题. (28认同)
  • @unutbu,如果它是文件中唯一的东西,那就是文档字符串.在它之前加上一些代码,它将从`pyc`中消失.我编辑了答案,并将"模块"放入具有文档字符串的事物列表中. (22认同)
  • 虽然你*可以*使用多行字符串作为多行注释,但我很惊讶这些答案都没有提到[PEP 8小节](http://legacy.python.org/dev/peps/pep- 0008 /#block-comments)特别建议从连续的单行注释中构造多行注释,用空白的`#`行来区分段落. (17认同)
  • 嗯.我在python脚本`test.py`中放了一个巨大的多行字符串.当我执行`import test`时,会生成`test.pyc`文件.不幸的是,`pyc`文件很大,并且包含整个字符串作为纯文本.我误解了什么,或者这条推文不正确? (14认同)
  • @Sven,[我的编辑](http://kate-editor.org/)恰好将它们标记为注释,除非在表达式中使用.也许你可以(打开一个请求)修复编辑器的语法高亮?Python确实忽略了这些,因此它们是*注释.但是,这是一个品味问题. (2认同)
  • @AirThomas:是的,我同意.不是非常确定从"使用这个,它是伟大的和BDFL祝福"改变200+答案是否公平"你可以使用它,但它不是你想要回购的东西",但我继续并做出了改变. (2认同)
  • 我对使用三引号持谨慎态度。在 Python 2 中,这似乎很好,但我发现在 Python 3 中,当 \N 位于三引号中时,库会抛出错误......因为它读起来像文档字符串。下面是一个示例: ''' (即 \Device\NPF_..) ''' 这将导致错误,因为它读取 \N 并且不再像真正的注释一样工作,而是解释其中的内容。这让我想知道编译是否也在解释三重引号...在编译时不应该考虑真正的注释,对吧? (2认同)
  • 如果您的评论包含您希望能够复制粘贴的长文本,则必须将其全部放在一行或使用块注释.阻止评论的另一票. (2认同)
  • fyi,使用字符串文字(单引号或引号引用)可能会导致奇怪的问题.例如,我最近得到了一个"缩进错误...",我最终发现这是因为在`elif`语句之前有一个三重引用的'''注释''.由于'''string-literal'''实际上只是不执行任何操作的代码(不是注释),它确实会影响缩进. (2认同)
  • 使用 '''` 进行多行注释是一个糟糕的过程,因为它不会像实际注释那样被解释器忽略。它会立即被垃圾收集,但代码仍在使用资源。 (2认同)
  • 我不得不说这是一个*非常*糟糕的语法选择(Python 开发人员的错,而不是你的错)。为什么?如果不是因为其他评论中的许多原因,因为包括 Jupyter 在内的大多数 IDE 会自动为您提供 2 个单引号而不是 1 个,因此获得 3 个单引号很痛苦。然而,改变这种行为是不值得的。语法应该像许多其他更明智的选择一样,包括`/* */`。 (2认同)
  • 这个答案是不正确的。多行字符串与注释不同。注释是空白的,没有语义解释。但是,多行注释可以。 (2认同)

unu*_*tbu 78

从某种意义上说,Python确实有一个多行字符串/注释语法,除非用作文档字符串,否则多行字符串不会生成字节码 - 就像 - #引用注释一样.实际上,它的行为与评论完全相同.

另一方面,如果你说这个行为必须在官方文档中记录为真正的注释语法,那么是的,你说这是不正确的,作为语言规范的一部分是正确的.

在任何情况下,您的编辑器也应该能够轻松地注释掉所选区域(通过#单独放置在每条线的前面).如果没有,请切换到可执行的编辑器.

没有特定文本编辑功能的Python编程可能是一种痛苦的经历.找到正确的编辑器(并知道如何使用它)可以对Python编程体验的感知方式产生重大影响.

编辑器不仅能够注释掉所选区域,还应该能够轻松地向左右移动代码块,并且当您按Enter键时应自动将光标置于当前缩进级别.代码折叠也很有用.


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

@BSUCSClub Python技巧:您可以使用多行字符串作为多行注释.除非用作文档字符串,否则它们不会生成代码!:-)

  • 三引号字符串(''')确实可用于完成多行注释. (3认同)
  • 我想要的是在测试时注释掉整个代码块的简单方法.其他语言也很容易.Python只是一种痛苦. (3认同)
  • @HappyLeapSecond我认为你应该澄清它说"Python没有*true*多行注释语法,但支持可用作注释的多行字符串." (2认同)

Aya*_*Aya 42

从接受的答案......

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

这是不正确的.与注释不同,三重引用的字符串仍然被解析,并且必须在语法上有效,无论它们出现在源代码中的何处.

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

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
Run Code Online (Sandbox Code Playgroud)

你会得到......

ValueError: invalid \x escape
Run Code Online (Sandbox Code Playgroud)

...在Python 2.x或...上

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

...在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()
Run Code Online (Sandbox Code Playgroud)

  • '''''"评论"有更多限制.您只能注释掉整个语句,而注释可以注释掉表达式的各个部分.示例:在C中,您可以注释掉一些列表元素:`int a [] = {1,2,/*3,4,*/5};`.使用多行字符串时,您不能这样做,因为这会在列表中放入一个字符串. (11认同)
  • 好吧,任何“真实”的多行注释也必须被解析并且在语法上是有效的。例如,C 风格的注释不能包含 `*/`,因为它会终止块。 (2认同)
  • @ dan1111 很明显,注释不能包含结束标记,但这是唯一的限制。 (2认同)

小智 34

在Python 2.7中,多行注释是:

"""
This is a
multilline comment
"""
Run Code Online (Sandbox Code Playgroud)

如果你在一个类中,你应该正确地选中它.

例如:

class weather2():
   """
   def getStatus_code(self, url):
       world.url = url
       result = requests.get(url)
       return result.status_code
   """
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助!

  • 三引号是插入不执行任何操作的文本的一种方式(我相信你也可以使用常规的单引号字符串来执行此操作),但它们不是注释 - 解释器确实执行该行(但该行没有什么都不做.这就是为什么三重引用的"评论"的缩进很重要. (18认同)
  • 这个解决方案是不正确的,`weather2`注释实际上是一个文档字符串,因为它是该类中的第一件事. (12认同)

San*_*rma 24

AFAIK,Python没有块注释.要评论单个行,您可以使用该#字符.

如果您使用的是Notepad ++,则可以使用块注释的快捷方式.我确信像gVimEmacs这样的人也有类似的功能.

  • @FernandoGonzalezSanchez:这真的不错.这种"多行字符串作为注释"可以最好地描述为"专业提示".官方Python文档对此没有任何说明,因此OP发布的问题. (9认同)
  • 这是文档字符串的PEP; 该页面上没有一处提及"评论". (8认同)
  • 这是不正确的,请参阅有关使用三重引号的响应。 (2认同)

Ant*_*rth 12

我认为它没有,除了不处理多行字符串.但是,大多数(如果不是所有)Python IDE都有一个用于"注释掉"多行代码的快捷键.


alp*_*989 10

如果你发表评论

"""
long comment here
"""
Run Code Online (Sandbox Code Playgroud)

在脚本中间,python/linters不会重新识别它.折叠将被搞砸,因为上述评论不是标准建议的一部分.它更好用

# long comment
# here.
Run Code Online (Sandbox Code Playgroud)

如果你使用vim,你可以插件,如https://github.com/tpope/vim-commentary,通过按下自动注释掉长行注释Vjgcc.当Vj选择两行代码,并gcc评论他们.

如果你不想使用上面的插件你可以使用搜索和替换之类的

:.,.+1s/^/# /g.

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


小智 8

多行注释没有这种功能。#是注释一行代码的唯一方法。你们中的许多人都回答了'''评论'''这是他们的解决方案。尽管它似乎可以正常工作,但在python内部在'''时将封闭的行作为常规字符串使用,解释器不会忽略使用#等注释。

在此处查看官方文档


小智 6

好吧,你可以尝试这个(运行引用时,第一个问题的输入应该用 引用'):

"""
print("What's your name? ")
myName = input()
print("It's nice to meet you " + myName)
print("Number of characters is ")
print(len(myName))
age = input("What's your age? ")
print("You will be " + str(int(age)+1) + " next year.")

"""
a = input()
print(a)
print(a*5)
Run Code Online (Sandbox Code Playgroud)

两者之间包含的任何内容都"""将被注释。

如果您正在寻找单行注释,那么它就是#.


小智 5

不幸的是,字符串化并不总是可以用作注释!因此,更安全的做法是坚持在每行前面加一个#

这是一个例子:

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

test2 = [1, 2, '''3, 4,'''] # test2 contains 2 integers **and the string** '3, 4,'
Run Code Online (Sandbox Code Playgroud)


Vir*_*oop 5

Python 中的多行注释:

对我来说,“”和“”都有效。

例子:

a = 10
b = 20
c = a+b
'''
print ('hello')
'''
print ('Addition is: ', a+b)
Run Code Online (Sandbox Code Playgroud)

例子:

a = 10
b = 20
c = a+b
"""
print('hello')
"""
print('Addition is: ', a+b)
Run Code Online (Sandbox Code Playgroud)


tym*_*mac 5

Visual Studio Code通用官方多行注释切换。

macOS:选择代码块,然后选择?+/

Windows:选择代码块,然后Ctrl+/


joj*_*ojo 5

我建议不要使用"""多行注释!

下面是一个简单的例子来突出可能被认为是意外行为的情况:

print('{}\n{}'.format(
    'I am a string',
    """
    Some people consider me a
    multi-line comment, but
    """
    'clearly I am also a string'
    )
)
Run Code Online (Sandbox Code Playgroud)

现在看看输出:

I am a string

    Some people consider me a
    multi-line comment, but
    clearly I am also a string
Run Code Online (Sandbox Code Playgroud)

多行字符串不被视为注释,而是与'clearly I'm also a string'连接形成单个字符串。

如果您想注释多行,请根据PEP 8指南进行操作

print('{}\n{}'.format(
    'I am a string',
    # Some people consider me a
    # multi-line comment, but
    'clearly I am also a string'
    )
)
Run Code Online (Sandbox Code Playgroud)

输出:

I am a string
clearly I am also a string
Run Code Online (Sandbox Code Playgroud)


Nem*_*lov 5

如果在有代码的一行中写注释,则必须写注释,#号前留2个空格,#号前留1个空格

print("Hello World")  # printing
Run Code Online (Sandbox Code Playgroud)

如果换行写注释,必须写注释,#号处留1个空格kn

# single line comment
Run Code Online (Sandbox Code Playgroud)

要编写超过 1 行的注释,请使用 3 个引号

"""
This is a comment
written in
more than just one line
"""
Run Code Online (Sandbox Code Playgroud)