274

好的,我知道三引号字符串可以用作多行注释。例如,

"""Hello, I am a 
   multiline comment"""

'''Hello, I am a 
   multiline comment'''

但从技术上讲,这些是字符串,对吗?

我已经用谷歌搜索并阅读了 Python 样式指南,但我无法找到关于为什么没有正式实现多行、/* */ 注释类型的技术答案。我使用三引号没有问题,但我有点好奇是什么导致了这个设计决定。

4

18 回答 18

281

我怀疑你会得到比“Guido 觉得不需要多行注释”更好的答案。

Guido 曾在推特上发表过这样的评论:

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

于 2008-12-29T05:06:00.727 回答
60

多行注释很容易被破坏。如果您在一个简单的计算器程序中有以下内容怎么办?

operation = ''
print("Pick an operation:  +-*/")
# Get user input here

尝试用多行注释来评论它:

/*
operation = ''
print("Pick an operation:  +-*/")
# Get user input here
*/

糟糕,您的字符串包含结束注释分隔符。

于 2008-12-29T15:44:08.537 回答
38

三引号文本不应被视为多行注释;按照惯例,它们是docstrings。他们应该描述你的代码做什么以及如何使用它,而不是像注释掉代码块这样的事情。

根据 Guido 的说法,Python 中的多行注释只是连续的单行注释(搜索“块注释”)。

为了注释代码块,我有时使用以下模式:

if False:
    # A bunch of code
于 2008-12-29T14:16:05.953 回答
30

这可能会回到核心概念,即应该有一种明显的方式来完成一项任务。额外的注释样式会增加不必要的复杂性,并可能降低可读性。

于 2008-12-29T05:04:11.167 回答
12

好吧,三引号用作文档字符串中的多行注释。并且 # 注释用作内联注释,人们习惯了它。

大多数脚本语言也没有多行注释。也许这就是原因?

参见PEP 0008注释部分

看看你的 Python 编辑器是否提供了一些用于块注释的键盘快捷键。Emacs 和 Eclipse 都支持它,大概大多数像样的 IDE 都支持。

于 2008-12-29T05:05:00.450 回答
9

来自Python 之禅

应该有一种——最好只有一种——明显的方法来做到这一点。

于 2008-12-29T16:18:23.820 回答
6

要在Pycharm IDE 中注释掉一段代码:

  • 代码 | 带行注释的注释
  • Windows 或 Linux:Ctrl+/
  • 操作系统:Command+/
于 2015-04-06T20:02:59.407 回答
5

就我个人而言,我在说 Java 时的评论风格就像

/*
 * My multi-line comment in Java
 */

所以如果你的风格是前面例子的典型风格,那么只有单行注释并不是一件坏事,因为相比之下你会有

#
# My multi-line comment in Python
#

VB.NET 也是一种只有单行评论的语言,我个人觉得这很烦人,因为评论最终看起来不像是喜欢的评论,而更像是某种引用

'
' This is a VB.NET example
'

单行注释最终比多行注释使用更少的字符,并且可能不太可能被正则表达式语句中的一些狡猾的字符转义?不过,我倾向于同意内德的观点。

于 2008-12-29T16:27:01.320 回答
4
# This
# is
# a 
# multi-line
# comment

在您的编辑器中使用注释块或搜索和替换 (s/^/#/g) 来实现此目的。

于 2008-12-29T15:17:54.503 回答
3

我通过为我的文本编辑器 (TextPad) 下载一个宏来解决这个问题,它可以让我突出显示行,然后在每行的第一行插入 #。一个类似的宏删除了#。有些人可能会问为什么多行是必要的,但当您尝试“关闭”一段代码以进行调试时,它会派上用场。

于 2012-11-15T09:54:37.933 回答
3

对于在 Python 中寻找多行注释的任何其他人 - 使用三引号格式可能会产生一些问题,因为我刚刚学会了艰难的方法。考虑一下:

this_dict = {
    'name': 'Bob',

"""
This is a multiline comment in the middle of a dictionary
"""

    'species': 'Cat'
}

多行注释将被塞进下一个字符串,弄乱了 'species'键。最好只#用于评论。

于 2019-07-18T12:49:39.963 回答
1

做一件事应该只有一种方法,这与使用多行字符串和单行字符串或 switch/case 以及不同形式的循环相矛盾。

多行注释是一个非常常见的功能,让我们面对现实吧,多行字符串注释是一种带有负面影响的 hack!我已经看到很多代码在使用多行注释技巧,甚至编辑器也使用它。

但我猜每种语言都有它的怪癖,开发者坚持从不修复它。我也知道 java 方面的这些怪癖,自 90 年代后期以来一直开放,永远不会被修复!

于 2020-10-12T14:37:10.920 回答
0

假设它们只是被认为是不必要的。由于只需键入非常容易,因此#a comment多行注释可以只包含许多单行注释。

另一方面,对于HTML ,更需要多线程。继续打字更难<!--comments like this-->

于 2008-12-29T05:35:39.730 回答
0

这只是一个猜测..但是

因为它们是字符串,所以它们具有一些语义价值(编译器不会删除它们),因此将它们用作文档字符串是有意义的。它们实际上成为AST的一部分,因此提取文档变得更容易。

于 2008-12-29T05:38:01.223 回答
0

因为# 约定是一个常见的约定,并且对于多行注释确实没有什么可以用#-sign 注释做的。这是一个历史性的意外,就像/* ... */评论的祖先可以追溯到 PL/I,

于 2008-12-29T06:01:33.953 回答
0

此外,多行注释是个婊子。很抱歉,但不管是哪种语言,除了调试目的之外,我不会将它们用于任何其他目的。假设你有这样的代码:

void someFunction()
{
    Something
    /*Some comments*/
    Something else
}

然后你发现你的代码中有一些东西你不能用调试器修复,所以你开始手动调试它,用这些多行注释注释掉越来越小的代码块。这将给出函数:

void someFunction()
{ /*
    Something
   /* Comments */
   Something more*/
}

这真的很烦人。

于 2008-12-29T16:28:12.333 回答
0

使用IDLE的多行注释:

  • Mac OS X,在代码选择之后,使用 + 注释代码块Ctrl3使用Ctrl+取消注释4

  • Windows,在代码选择后,用Ctrl++注释代码块并使用Alt++取消注释。3CtrlAt4

于 2013-10-04T01:45:06.883 回答
-1

我记得读过一个人将他的多行评论放入三引号变量中:

x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''

这确实占用了一些内存,但它为您提供了多行注释功能,而且大多数编辑器会为您突出显示语法:)

通过简单地包装代码也很容易注释掉代码

x = '''

'''
于 2011-06-19T14:27:14.870 回答