有没有办法在Python中创建多行注释?


1156

我最近开始研究Python,但是找不到如何实现多行注释。大多数语言都有块注释符号,例如

/*

*/

我在Python中尝试过此方法,但它引发了错误,因此这可能不是正确的方法。Python实际上是否具有多行注释功能?


2
我认为这是一种解释性语言,就像在sh或bash或zsh的情况下那样,这#是唯一的注释方式。我猜想这样可以更轻松地解释Python脚本。
Victor Zamanian

1
我知道这个答案很旧,但是我遇到了这个问题,因为我有同样的问题。尽管我对Python的了解还不足以了解为什么它可能不正确(根据ADTC)的复杂性,但可接受的答案确实有用。
布兰登·巴尼

5
@BrandonBarney让我解释一下这个问题。接受的答案使用“'',实际上创建了一个不执行任何操作的多行字符串。从技术上讲,这不是评论。例如,您可以编写k ='''fake comment,real string'''。然后,打印(k)以查看ADTC的含义。
pinyotae

3
现在,这变得更加有意义。我习惯在vba中创建未使用的字符串会导致错误。我没有意识到python只会忽略它。至少,它仍然可以用于调试和学习,但是对于实际开发而言,这并不是一个好习惯。
布兰登·巴尼

在Python源代码中,如果您将长行折断,编辑器会自动对其进行缩进,以显示折线确实是前一行的一部分?如果我要弄乱一长串伪代码,那该怎么办?
alpha_989 '18

Answers:


1802

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

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

(请确保'''适当缩进引线,以避免出现IndentationError。)

Guido van Rossum(Python的创建者)在推特上发了一条“专业提示”。

但是,Python的样式指南PEP8 倾向于使用连续的单行注释,这也是在许多项目中都可以找到的。文本编辑器通常具有快捷方式来轻松实现此目的。


17
嗯 我将巨大的多行字符串放在python脚本中test.py只是为了看看。当我这样做时import test,将test.pyc生成一个文件。不幸的是,pyc文件很大,并且包含整个字符串作为纯文本。我是在误解什么,还是这条推文不正确?
unutbu 2011年

23
@unutbu,如果这是文件中唯一的内容,则为文档字符串。将一些代码放在它的前面,它将从中消失pyc。我编辑了答案,并将“模块”放入具有文档字符串的内容列表中。
彼得·维克托林

31
我不喜欢多行字符串作为注释。语法高亮将它们标记为字符串,而不是注释。我喜欢使用一个体面的编辑器,该编辑器在键入时自动处理注释区域并包装多行注释。当然,这是一个品味问题。
Sven Marnach

61
按照惯例,我发现将其"""用于文档字符串和'''块注释非常有用。通过这种方式,您可以环绕'''通常的文档字符串而不会发生冲突。
Roshambo 2012年

19
尽管您可以将多行字符串用作多行注释,但令我惊讶的是,这些答案中没有一个涉及到PEP 8子节该子节特别建议从连续的单行注释中构造多行注释,并用空#行来区分段落。
航空

82

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

另一方面,如果您说必须在官方文档中记录此行为才是真正的注释语法,那么可以,您可以肯定地说这不是语言规范的一部分。

无论如何,您的文本编辑器还应该能够轻松注释掉所选区域(通过#在每个行的前面分别放置一个)。如果不是,请切换到可以的文本编辑器。

没有某些文本编辑功能的Python编程可能会很痛苦。找到合适的编辑器(并知道如何使用它)可以在如何理解Python编程经验方面产生很大的不同。

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


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

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


3
三引号字符串(''')确实可以满足多行注释。
Varun Bhatia

谢谢..使用(“')和(”“”)注释掉了该块,但对于Django应用程序却无济于事。所以选择了IDLE,并有诸如Comment out regionUncomment region之类的选项(快捷方式:Alt + 3和Alt + 4分别)下格式。菜单现在比以往任何时候..更多更容易
Saurav库马尔

您还应该考虑使用IDE。是的,它们很笨重,但是如果使用得当,它们确实可以增加编码时间。我个人曾经使用PyDev,现在使用PTVS(与Visual Studio一起使用)。我绝对会推荐PTVS,因为它非常好用,它包含上述功能以及更多功能–与virtualenvs直接集成,并且真的调试很好,至少可以说
Sbspider 2014年

2
@HappyLeapSecond我想您应该澄清它,说“ Python没有真正的多行注释语法,但是支持可用作注释的多行字符串。”
ADTC

3
我想要的是一种在测试时注释掉整个代码块的简便方法。其他语言使这变得容易。Python只是一个痛苦。
阿尔伯特·戈德弗林德'16

45

从接受的答案...

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

这是不正确的。与注释不同,三引号字符串仍然会被解析,并且在语法上必须有效,无论它们在源代码中的位置如何。

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

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'raw string'- r'\xor' == '\\xor'
GingerPlusPlus 2013年

1
好吧,任何“真实”多行注释也必须被解析并且在语法上有效。例如,C风格的注释不能包含*/,因为它将终止该块。

1
@ dan1111很明显,注释不能包含结束标记,但这是唯一的限制。
el.pescado 16/09/29

14
'''“评论”有更多的限制。您只能注释掉整个语句,而注释可以注释掉表达式的某些部分。示例:在C语言中,您可以注释掉一些列表元素:int a[] = {1, 2, /* 3, 4, */ 5};。使用多行字符串,您将无法执行此操作,因为这会将字符串放入列表中。
el.pescado 16/09/29

35

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

20
三引号是一种插入文本的方法,它不会执行任何操作(我相信您也可以使用常规的单引号字符串来执行此操作),但是它们不是注释-解释器实际上会执行该行(但是该行不会什么也没做)。这就是为什么三引号“注释”的缩进很重要的原因。
Demis 2015年

12
该解决方案是错误的,weather2注释实际上是一个文档字符串,因为它是类中的第一件事。
肯·威廉姆斯

同意@KenWilliams。这不是正确的解决方案。尝试将其放在函数/类的中间,并查看它如何弄乱您的格式并自动折叠/折叠代码。
alpha_989 '18

25

AFAIK,Python没有阻止注释。要注释单个行,可以使用该#字符。

如果使用的是Notepad ++则有一个用于块注释的快捷方式。我敢肯定,像gVimEmacs这样的人也有类似的功能。


2
这是不正确的,请参阅有关使用三重引号的响应。
费尔南多·冈萨雷斯·桑切斯

10
@FernandoGonzalezSanchez:确实没有错。最好将这种“多行字符串作为注释”描述为“专业提示”。官方Python文档对此一无所获,因此是OP发布的问题。
Sanjay T. Sharma

8
这是文档字符串的PEP;该页面上没有提及“评论”。
Sanjay T. Sharma

12

我认为没有,除了未处理多行字符串。但是,大多数(如果不是全部)Python IDE都具有用于“注释”多行代码的快捷键。


11

如果您发表评论

"""
long comment here
"""

在脚本中间,Python / lint无法识别。折叠将被弄乱,因为以上注释不是标准建议的一部分。最好用

# Long comment
# here.

如果使用Vim,则可以使用commentary.vim之类的插件通过按来自动注释掉较长的注释行Vjgcc。在其中Vj选择两行代码,并将gcc其注释掉。

如果您不想使用上述插件,则可以使用搜索和替换类似

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

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


8

没有多行注释等功能。#是注释一行代码的唯一方法。你们中的许多人都回答'''评论'''作为他们的解决方案。

它似乎可行,但是'''在Python 内部,它使用常规字符串将封闭的行作为解释器不会忽略的注释之类的注释#

在此处查看官方文档


5

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

这是一个例子:

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

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

4

好了,您可以尝试一下(在运行引号时,第一个问题的输入应用引号'):

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

包括在内的任何内容"""都会被评论。

如果您要查找单行注释,则为#


3

Python中的多行注释:

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

例:

a = 10
b = 20
c = a+b
'''
print ('hello')
'''
print ('Addition is: ', a+b)

例:

a = 10
b = 20
c = a+b
"""
print('hello')
"""
print('Addition is: ', a+b)

3

Python中的内联注释以井号字符开头。

hello = "Hello!" # This is an inline comment
print(hello)

你好!

请注意,字符串文字中的哈希字符只是哈希字符。

dial = "Dial #100 to make an emergency call."
print(dial)

拨打#100拨打紧急电话。

哈希字符也可以用于单行或多行注释。

hello = "Hello"
world = "World"
# First print hello
# And print world
print(hello)
print(world)

你好

世界

用三重双引号将文本括起来以支持文档字符串。

def say_hello(name):
    """
    This is docstring comment and
    it's support multi line.
    :param name it's your name
    :type name str
    """
    return "Hello " + name + '!'


print(say_hello("John"))

你好约翰!

将文本用三重单引号引起来以用于块注释。

'''
I don't care the parameters and
docstrings here.
'''

2

在Python 2.7.13上:

单:

"A sample single line comment "

多行:

"""
A sample
multiline comment
on PyCharm
"""

2
您是说单引号在python 2.7中创建注释?
mcalex17年

3
使用单引号创建一个字符串。单行注释应以#开头。
johanno


2

是的,可以同时使用以下两种:

'''
Comments
'''

"""
Comments
"""

但是,在IDE中运行时,您唯一需要记住的是,您必须“运行”整个文件才能被多行代码接受。逐行“运行”将无法正常工作,并会显示错误。


1

要注释掉Python中的多行代码,只需#在每一行上使用单行注释:

# This is comment 1
# This is comment 2 
# This is comment 3

要在Python中编写“适当的”多行注释,是使用具有"""语法的多行字符串Python具有文档字符串(或文档字符串)功能。它为程序员提供了一种在每个Python模块,函数,类和方法中添加快速注释的简便方法。

'''
This is
multiline
comment
'''

另外,请注意,您可以通过这样的类对象访问docstring

myobj.__doc__

与先前的答案相比,这又增加了什么?
Peter Mortensen

我的答案包含更多详细信息,可能对开发人员有更多帮助。
shafik


1

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

这是一个简单的示例,以突出显示可能被视为意外行为的内容:

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

现在看一下输出:

I am a string

    Some people consider me a
    multi-line comment, but
    clearly I am also a string

多行字符串不被视为注释,而是与之连接'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'
    )
)

输出:

I am a string
clearly I am also a string

语法突出显示不应该是“ lang-bash”而不是“ bash吗?无论如何,它通常看起来很奇怪(例如,此处为“ Some”),即使它实际上是带有参数的命令行命令。lang-none(关闭语法突出显示)可能是一个更好的选择。
Peter Mortensen

@PeterMortensen感谢您指出我们的怪异之处!和“ lang-none”一起去了。
jojo

0

使用PyCharm IDE。

您可以使用Ctrl + /commentuncomment代码行。Ctrl + /注释或取消注释当前行或用单行注释注释掉若干行({# in Django templates, or # in Python scripts)Pressing Ctrl+Shift+/对于Django模板中选定的源代码块,该块用{% comment %} and {% endcomment %}标签包围。


n = 5
while n > 0:
    n -= 1
    if n == 2:
        break
    print(n)

print("Loop ended.")

选择所有行,然后按 Ctrl + /


# n = 5
# while n > 0:
#     n -= 1
#     if n == 2:
#         break
#     print(n)

# print("Loop ended.")

0

多行注释实际上在Python中不存在。下面的示例包含一个未分配的字符串,该字符串已通过Python验证是否存在语法错误。

一些文本编辑器,例如Notepad ++,为我们提供了注释掉一段书面代码或单词的快捷方式。

def foo():
    "This is a doc string."
    # A single line comment
    """
       This
       is a multiline
       comment/String
    """
    """
    print "This is a sample foo function"
    print "This function has no arguments"
    """
    return True

另外,Ctrl+ K是Notepad ++中阻止评论的快捷方式。它#在所选内容的每行前面添加一个。Ctrl+ Shift+ K用于取消注释。


0

在其他答案中,我发现最简单的方法是使用IDE注释函数,该函数使用的Python注释支持#

我正在使用Anaconda Spyder,它具有:

  • Ctrl+ 1-评论/取消评论
  • Ctrl+ 4-注释一段代码
  • Ctrl+ 5-取消注释代码块

它将使用注释/取消注释单行/多行代码#

我觉得最简单。

例如,一个块注释:

# =============================================================================
#     Sample Commented code in spyder
#  Hello, World!
# =============================================================================

感谢@PeterMortensen的编辑:)
aniltilanthe

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.