为什么Python没有多行注释?

283

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

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

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

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

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


8
如果你可以用一个字符串实现,为什么还要添加更多的方式? - Brody
15
只是想补充一下,如果你试图评论的内容同时也有注释/多行字符串的话,这种方法就会失败。当然,这也是我们需要它们的原因。 - nycynik
58
@S.Lott 我认为这是一个有用的问题。为了理解为什么Python很好,了解做出的设计决策(以及正在进行的决策)非常重要。这个问题不是争论性或挑衅性的;它是好奇的。没有必要对好奇心如此严厉。 - Mark E. Haase
9
如果您需要为代码添加多行注释,只需在代码前加上if False: - AturSams
9
@Brody 因为字符串会被处理,而注释会被忽略。使用字符串作为注释会带来问题,你可以自己去看看周围的例子。 - ADTC
显示剩余4条评论
18个回答

286

我觉得你可能不会得到比“Guido没有感觉需要多行注释”更好的答案。

Guido已经发布推文

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


30
请参阅Guido的推文 - Petr Viktorin
18
混合使用多行字符串和块注释的一个劣势是,IDE 不知道你想要什么,因此无法根据需要以不同的样式显示注释。 - Baiyan Huang
27
这还会导致无法使用多行字符串注释代码(如果不小心的话还可能导致缩进错误)。呃! - Mike Graham
4
我曾在许多领域工作过,如果你的代码包含注释掉的代码,那么你的代码就会被拒绝,甚至可能会被邀请更新你的简历。要么删除不需要的代码,如果代码已经在版本控制下,则没有问题;要么在需要禁用的代码前使用“if False:”。 - Steve Barnes
13
@SteveBarnes认为在生产环境中大块的被注释掉的代码是不好的。但我不明白为什么使用if False更好。虽然它可以达到完全相同的效果,但不够清晰(因为一眼看上去并不容易发现这个代码块已被禁用)。 注:原文中有专业术语"commented-out code"指被注释掉的代码。 - user1919238
显示剩余6条评论

61

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

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

抱歉,您的字符串包含了结束注释分隔符。


182
这个答案最棒的地方就是它被SO的语法高亮器处理得非常好。 - Nietzche-jou
78
这就是我们拥有转义字符的诸多原因之一,我认为这并不是不支持多行注释的好理由。 - Natalie Adams
38
我不理解你的逻辑 - 或许我的评论不够清晰。如果我们使用 \ 作为转义字符: print("Pick an operation: +-/") 那么 "/" 不再表示结束注释块,而是实际上会被打印出来。你可以在C++中尝试一下。事实上,SO的语法高亮器将显示它是有效的。这不是一个复杂的主题,在其他语言中已经存在多年了。我建议你更新你的帖子,包括使用转义字符以展示你可以在代码中使用 "*/"。 - Natalie Adams
27
如果您的代码包含 ''',那该怎么办?糟糕,您的代码包含了结束注释分隔符。 - siamii
27
多行注释并非本质上无法打破;只是大多数实现它们的方式是可打破的(包括Python)。在我看来,Python中解决多行注释的明显方法是让我用 #: 开始一个注释块,并使用缩进来显示注释何时结束。这种方法清晰、一致,并且完美地处理了嵌套。 - GatesDA
显示剩余9条评论

40

三重引号的文本不应被视为多行注释,按照惯例它们是文档字符串。它们应该描述你的代码做什么以及如何使用它,但不适用于像注释掉代码块这样的事情。

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

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

if False:
    # A bunch of code

7
看起来Guido改变了他的想法。 - Petr Viktorin
5
关于“if false:”解决方案,关键是Python使用制表符,你需要在“if False:”下缩进所有代码,并在该代码块之后取消缩进。因此,你需要非常熟练地使用文本编辑器。 - barlop
3
如果你使用一个不错的编辑器,那么所需时间应该与 * 相同。 - AturSams
@barlop 没错 - 学习你的编辑器!在vim中通常可以在不到一秒钟的时间内通过 V}>> 实现。 - Kenan Banks
多行/三引号字符串不一定是文档字符串,反之亦然。文档字符串是“在模块、函数、类或方法定义中作为第一条语句出现的字符串文字”,无论它是否多行。在代码的其他地方未使用(未分配或未在语句/表达式中使用)的字面值(字符串或其他类型),将在编译时被丢弃。 - jonrsharpe

32

这可能与核心概念有关,即执行任务应该有一种明显的方法。添加额外的注释样式会增加不必要的复杂性,降低可读性。


11
这就是问题所在,我认为:使用字符串作为注释不明显,并且违反了“一种任务只有一种方法”的原则,因为有两种方法可以进行注释:字符串和# - GatesDA
1
但这与C语言类似,没有明显的区别:/* vs //,因此我不认为它明显更差。 - B Robster
// 考虑为什么有人想要多行注释。好的理由是:...我真的想不出除了“我不必输入那么多这些#小玩意儿”和“我需要以非常精确的方式显示这个特定的注释,而那种精确的方式不允许前面有#。”假设有人想要做一个ASCII图表,或者放一些参考JavaScript代码,以便在出现特定问题时复制和粘贴。在这里,完成任务的唯一明显方法无法涵盖该任务的边缘情况。尽管如此,我认为额外的注释样式是不好的。 - Nathan Basanese
4
"我不必输入那么多的这些#小玩意儿"。这正是几乎所有语言都有块注释(/../)的原因。信不信由你,我喜欢记录我的代码所做的事情:输入、输出、使用的算法、参数等等。这是很多文本,也会被修改。只限制单行注释简直荒谬。请注意,我不主张注释掉代码的方法——虽然在尝试替代方法时经常很方便,但前提是了解可能存在的副作用。 - Albert Godfrind
3
我对 Python 的另一件不满之处在于它本质上是一种由一个人设计的语言。无论 Guido 说什么都是真理......因此,我们在不同版本之间会发现很多奇怪的不兼容性。为什么?因为 Guido 这么说了...... - Albert Godfrind

12

嗯,三重引号在文档字符串中用作多行注释。#注释用作内联注释,并且人们习惯使用它。

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

请参见PEP 0008,第评论节。

同时,请查看您的Python编辑器是否提供块注释的键盘快捷方式。Emacs支持它,以及Eclipse,可能大部分好的IDE也支持。


9

来自Python之禅

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


1
然而,Python完全不遵循这一点。例如,有4种不同的方法来退出程序。还有许多其他的例子。 - mczarnek

7

Pycharm IDE 中注释掉一段代码的方法:

  • 选择要注释的代码块
  • 选择 Code | Comment with Line Comment
  • Windows 或 Linux:按下 Ctrl + /
  • Mac OS:按下 Command + /

5

就我个人而言,在Java中我的注释风格通常是这样的:

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

如果您的编码风格与前面的示例相似,那么仅有单行注释并不是一个坏事,因为相比之下您会有更少的

#
# My multi-line comment in Python
#

VB.NET也是一种只有单行注释的语言,个人认为这很烦人,因为注释看起来更像引用,而不是注释。

'
' This is a VB.NET example
'

单行注释在字符使用方面比多行注释更少,并且不太可能被一些有问题的字符在正则表达式语句中转义。不过我倾向于同意Ned的看法。


4

对于其他想要在Python中使用多行注释的人们——使用三引号格式可能会带来一些问题,就像我刚刚以艰难的方式学到的那样。请考虑以下代码:

this_dict = {
    'name': 'Bob',

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

    'species': 'Cat'
}

多行注释会被隐藏在下一个字符串中,从而破坏了“species”键。最好只使用“#”进行注释。

这就是为什么我们需要多行语法的原因。为什么Guido不觉得有这个必要呢? - undefined
@Ooker 一个普通的集成开发环境只需要一次点击就可以注释掉多行代码,正如其他人指出的那样(例如https://stackoverflow.com/a/29478739/8874696),所以整个操作是多余的。 - undefined

3

我通过下载文本编辑器(TextPad)的宏来解决这个问题,该宏可以让我突出显示行,然后在每行的开头插入#。类似的宏可以删除#。有些人可能会问为什么需要多行,但当您尝试为调试目的“关闭”代码块时,它非常方便。


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