【问题标题】:Is there a way to create multiline comments in Python?有没有办法在 Python 中创建多行注释?
【发布时间】:2021-09-24 16:42:15
【问题描述】:

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

/*

*/

我在 Python 中尝试过,但它会引发错误,所以这可能不是正确的方法。 Python 真的有多行注释功能吗?

【问题讨论】:

  • 我想作为一种解释性语言,就像在 sh 或 bash 或 zsh 的情况下一样,# 是制作 cmets 的唯一方法。我猜想以这种方式解释 Python 脚本会更容易。
  • 我知道这个答案很旧,但我遇到了它,因为我有同样的问题。接受的答案确实有效,尽管我对 Python 的了解不够多,无法知道为什么它可能不正确的复杂性(根据 ADTC)。
  • @BrandonBarney 让我解释一下这个问题。使用 ''' 的公认答案实际上创建了一个不执行任何操作的多行字符串。从技术上讲,这不是评论。例如,你可以写 k = '''假评论,真正的字符串'''。然后, print(k) 看看 ADTC 是什么意思。
  • 现在更有意义了。我习惯于在 vba 中创建未使用的字符串会导致错误。我没有意识到python只是忽略了它。至少它仍然适用于调试和学习,但不是实际开发的好习惯。
  • 在Python源代码中,如果断行,编辑器会自动缩进,显示断行真的是前一行的一部分吗?如果我分解一长串伪代码,我应该这样做吗?

标签: python comments documentation


【解决方案1】:

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

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

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

Guido van Rossum(Python 的创建者)tweeted this 作为“专业提示”。

然而,Python 的风格指南,PEP8,favors using consecutive single-line comments,是这样的:

# This is a multiline
# comment.

...这也是您在许多项目中会发现的。文本编辑器通常有一个快捷方式可以轻松完成此操作。

【讨论】:

  • 嗯。我在 python 脚本test.py 中放了一个巨大的多行字符串,只是为了看看。当我执行import test 时,会生成一个test.pyc 文件。不幸的是,pyc 文件很大,并且包含整个字符串作为纯文本。是我误解了什么,还是这条推文不正确?
  • @unutbu,如果它是文件中唯一的东西,它就是一个文档字符串。在它前面加上一些代码,它就会从pyc 中消失。我编辑了答案并将“模块”放入具有文档字符串的事物列表中。
  • 我不喜欢多行字符串作为 cmets。语法高亮将它们标记为字符串,而不是 cmets。我喜欢使用一个不错的编辑器,它会在我输入时自动处理注释掉区域和包装多行 cmets。当然,这是一个品味问题。
  • 作为惯例,我发现将""" 用于文档字符串和''' 用于块cmets 很有帮助。通过这种方式,您可以将''' 包裹在您常用的文档字符串中而不会发生冲突。
  • 虽然您可以将多行字符串用作多行 cmets,但令我惊讶的是,这些答案都没有提到专门建议构建多行的 the PEP 8 subsection cmets 来自连续的单行 cmets,用空白的# 行来区分段落。
【解决方案2】:

Python 确实有一个multiline string/comment syntax,除非用作文档字符串,否则multiline strings generate no bytecode——就像#-前置cmets。实际上,它的行为与评论完全一样。

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

在任何情况下,您的文本编辑器也应该能够轻松地注释掉选定区域(通过在每行前面分别放置一个#)。如果没有,请切换到可以的文本编辑器。

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

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


为了防止链接失效,这里是Guido van Rossum's tweet的内容:

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

【讨论】:

  • 三引号字符串 (''') 确实可以实现多行 cmets。
  • 谢谢.. 使用 (''') 和 (""") 注释掉该块,但它对 Django 应用程序没有帮助。所以选择了 IDLEFormat菜单下有Comment out regionUncomment region(快捷键分别为Alt+3和Alt+4)等选项。现在是比以往任何时候都更容易..
  • 您还应该考虑使用 IDE。是的,它们很重,但如果使用得当,它们确实可以增加编码时间。我个人曾经使用 PyDev,现在使用 PTVS(与 Visual Studio)。我肯定会推荐 PTVS,因为它非常好用,包含上述功能以及更多功能 - 与 virtualenvs 的直接集成,以及非常好的调试,至少可以说
  • @HappyLeapSecond 我认为您应该澄清一下“Python 没有 true 多行注释语法,但支持可用作 cmets 的多行字符串。”跨度>
  • 我想要的是一种在测试时注释掉整个代码块的简单方法。其他语言使这变得容易。 Python 只是一种痛苦。
【解决方案3】:

从接受的答案...

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

这根本不是真的。与 cmets 不同,三引号字符串仍然会被解析,并且必须在语法上有效,无论它们出现在源代码中的什么位置。

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

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

执行被解析器忽略的多行 cmets 的唯一方法是...

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'
  • 好吧,任何“真正的”多行注释也必须经过解析并且在语法上有效。例如,C 风格的 cmets 不能包含 */,因为它将终止块。
  • @dan1111 很明显评论不能包含结束标记,但这是唯一的限制。
  • ''' "cmets" 有更多限制。您只能注释掉整个语句,而 cmets 可以注释掉部分表达式。示例:在 C 中,您可以注释掉一些列表元素:int a[] = {1, 2, /* 3, 4, */ 5};。使用多行字符串,您不能这样做,因为这会将字符串放入您的列表中。
【解决方案4】:

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

【讨论】:

  • 三引号是一种插入不做任何事情的文本的方法(我相信您也可以使用常规的单引号字符串来做到这一点),但它们不是 cmets - 解释器实际上是执行该行(但该行不执行任何操作)。这就是为什么三引号“评论”的缩进很重要。
  • 这个解决方案不正确,weather2 注释实际上是一个文档字符串,因为它是类中的第一件事。
  • 同意@KenWilliams。这不是一个正确的解决方案。试着把它放在一个函数/类的中间,看看它是如何弄乱你的格式和自动化代码折叠/linting的。
【解决方案5】:

AFAIK,Python 没有块 cmets。对于单独的行注释,您可以使用# 字符。

如果您使用的是Notepad++there is a shortcut for block commenting。我相信像gVimEmacs 这样的其他人也有类似的功能。

【讨论】:

  • 这是不正确的,请参阅使用三引号的响应。
  • @FernandoGonzalezSanchez:这真的没有错。这种“多行字符串作为注释”可以最好地描述为“专业提示”。官方 Python 文档对此只字未提,因此 OP 发布了这个问题。
  • 这是文档字符串的 PEP;该页面上没有提及“评论”。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    如果你发表评论

    """
    long comment here
    """
    

    在脚本中间,Python/linter 无法识别。折叠会搞砸,因为上述评论不是标准建议的一部分。更好用

    # Long comment
    # here.
    

    如果你使用Vim,你可以使用commentary.vim之类的插件,通过按Vjgcc自动注释掉长行的cmets。其中Vj 选择两行代码,gcc 将它们取出。

    如果你不想使用像上面这样的插件,你可以使用搜索和替换

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

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

    【讨论】:

      【解决方案8】:

      没有像多行注释这样的功能。 # 是注释一行代码的唯一方法。 你们中的许多人回答“”评论“”这是他们的解决方案。

      这似乎可行,但在 Python 内部 ''' 将包含的行作为常规字符串,解释器不会像使用 # 的注释一样忽略这些行。

      Check the official documentation here

      【讨论】:

      • 这应该是公认的答案
      【解决方案9】:

      Visual Studio Code通用官方多行评论切换。类似于 Xcode 快捷方式。

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

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

      【讨论】:

        【解决方案10】:

        不幸的是,字符串化并不总是可以用作注释!因此,坚持在每行前面加上 # 的标准会更安全。

        这是一个例子:

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

        【讨论】:

          【解决方案11】:

          我建议不要将 """ 用于多行 cmets!

          这里有一个简单的例子来突出可能被认为是意外行为:

          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
          

          【讨论】:

            【解决方案12】:

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

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

            """ 之间的任何内容都将被评论。

            如果您正在寻找单行 cmets,那么它是 #

            【讨论】:

              【解决方案13】:

              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)
              

              【讨论】:

                【解决方案14】:

                Python 中的内联 cmets 以哈希字符开头。

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

                你好!

                请注意,字符串文字中的散列字符只是散列字符。

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

                拨打 #100 拨打紧急电话。

                哈希字符也可用于单行或多行 cmets。

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

                你好约翰!

                块 cmets 用三个单引号将文本括起来。

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

                【讨论】:

                  【解决方案15】:

                  在 Python 2.7.13 上:

                  单身:

                  "A sample single line comment "
                  

                  多行:

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

                  【讨论】:

                  • 你是说单引号在 python 2.7 中创建注释?
                  • 使用单引号创建一个字符串。单行注释应以 # 为前缀。
                  【解决方案16】:

                  使用 PyCharm IDE。

                  您可以使用 Ctrl+/commentuncomment 行代码。 Ctrl+/ 使用单行 cmets ({# in Django templates, or # in Python scripts) 对当前行或多个选定行进行 cmets 或 uncmets。 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.")
                  

                  【讨论】:

                    【解决方案17】:

                    是的,两者都可以使用:

                    '''
                    Comments
                    '''
                    

                    """
                    Comments
                    """
                    

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

                    【讨论】:

                      【解决方案18】:

                      如果在一行代码中写注释,一定要写注释,#号前留2个空格,#号前留1个空格

                      print("Hello World")  # printing
                      

                      如果在换行写注释,一定要写注释,#号处留1个空格kn

                      # single line comment
                      

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

                      """
                      This is a comment
                      written in
                      more than just one line
                      """
                      

                      【讨论】:

                      【解决方案19】:

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

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

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

                      '''
                      This is
                      multiline
                      comment
                      '''
                      

                      另外,提到你可以通过这样的类对象访问文档字符串

                      myobj.__doc__
                      

                      【讨论】:

                      • 这比以前的答案增加了什么?
                      • 我的回答包含更多细节,可能对开发者有更多帮助。
                      【解决方案20】:

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

                      我正在使用 Anaconda Spyder,它有:

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

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

                      我觉得这是最简单的。

                      例如,块注释:

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

                      【讨论】:

                        【解决方案21】:

                        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 用于块取消注释。

                        【讨论】:

                          【解决方案22】:

                          选择要注释的行,然后使用 Ctrl + ?Sublime Text 编辑器中注释或取消注释 Python 代码。

                          对于单行,您可以使用 Shift + #

                          【讨论】:

                            【解决方案23】:

                            您可以使用以下内容。这称为 DockString。

                            def my_function(arg1):
                                """
                                Summary line.
                                Extended description of function.
                                Parameters:
                                arg1 (int): Description of arg1
                                Returns:
                                int: Description of return value
                                """
                                return arg1
                            
                            print my_function.__doc__
                            

                            【讨论】:

                            【解决方案24】:

                            在 python 中,您可以按照以下步骤轻松使用多行 cmets

                            您可以将此文档字符串用于 python 中的多行 cmets。

                            """ print("结果为真")

                            """

                            【讨论】:

                            • 这已经在其他答案中解释过了。请务必在发布之前阅读其他答案 - 您应该避免重复可用信息。谢谢。
                            猜你喜欢
                            • 2013-07-11
                            • 1970-01-01
                            • 2019-03-09
                            • 2020-09-27
                            • 1970-01-01
                            • 2012-10-06
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多