为什么Python没有多行注释?


252

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

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

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

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

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


8
如果您可以将其作为字符串进行操作,为什么还要添加更多方法?
布罗迪

12
只是想补充一下,如果您要评论的内容碰巧也有评论/多行字符串,则失败。当然,这就是为什么我们需要它们。
nycynik

50
@ S.Lott我认为这是一个有用的问题。为了理解Python为什么是好的,重要的是要了解已经做出的设计决策(以及正在做出的持续决策)。这个问题不是争论性的也不是好斗的。很好奇 无需对好奇心如此苛刻。
Mark E. Haase 2012年

6
如果您需要鳕鱼的多行注释,只需if False:输入代码即可
AturSams 2015年

5
@Brody因为已处理字符串。评论将被忽略。使用字符串作为注释存在问题。随便看看:)
ADTC

Answers:


266

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

Guido在推特上发布了以下内容:

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


28
请参阅Guido对此的推文
彼得·维克托林

15
混合多行字符串和块注释的一个缺点是IDE不知道您想要什么,因此无法根据需要以不同的样式显示注释。
Baiyan Huang

21
这也使得不可能用多行字符串注释掉代码(如果不小心,可能导致缩进错误)。w!
Mike Graham 2012年

3
我在很多领域工作过,如果您的代码中包含注释掉的代码,那么您的代码将被拒绝,您甚至可能会发现自己被邀请更新自己的简历。删除不需要的代码,如果代码受版本控制,则不成问题,或者if False:在需要禁用的代码之前使用。
史蒂夫·巴恩斯

4
@SteveBarnes同意在生产中使用大量注释掉的代码是不好的。但是我不明白为什么if False更好。它完成了完全相同的事情,但不够清晰(因为乍一看该代码块已被禁用并不太明显)。

59

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

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

尝试用多行注释对此进行注释:

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

糟糕,您的字符串包含结尾注释定界符。


174
关于这个答案的最好的事情是SO的语法突出显示如何处理它。
尼采茹

73
这是我们使用转义字符的众多原因之一,我认为这是不支持多行注释的一个很好的理由。
Natalie Adams'4

34
我不明白您的逻辑-也许我的评论不够清楚。如果我们将\用作转义符:print(“选择一个操作:+-* \ /”)“ * /”不再表示结尾注释块,因为它将按原样/打印。继续并在C ++中对此进行测试。实际上,SO的语法突出显示工具将显示这是有效的。这不是一个复杂的主题,它在其他语言中已经存在多年了。我要求您更新您的帖子,以包括转义符的使用,以表明您可以在代码中使用“ * /”。
Natalie

23
如果您的代码包含'''怎么办?糟糕,您的代码包含结尾注释定界符
siamii 2011年

21
多行注释并不是天生就可以打破的。只是它们的大多数实现都是(包括Python)。在我看来,在Python中执行多行注释的显而易见的方法是,让我开始使用注释块,#:并使用缩进显示注释的结束时间。它干净,一致,并且可以完美地处理嵌套。
GatesDA 2012年

34

用三引号括起来的文本不应视为多行注释;按照惯例,它们是docstrings。他们应该描述您的代码做什么以及如何使用它,而不是描述诸如注释代码块之类的内容。

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

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

if False:
    # A bunch of code

6
从那以后,似乎Guido 改变了主意
彼得·维克托林

5
关于“ if false:”解决方案,问题在于在python中,它与制表符一起使用时,您必须在“ if False:”下的所有代码中都进行制表。然后取消标签。因此,您必须在文本编辑器中非常漂亮。
barlop

3
如果使用体面的编辑器,则该时间应与* /
AturSams 2015年

@barlop yup-了解您的编辑器!通常可以在少于一秒钟的时间内通过V}>>
Triptych

30

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


8
我认为,这就是问题所在:使用字符串作为注释并不明显,并且违反了“一种执行任务的方式”的原则,因为有两种方法可以执行注释:字符串和#
GatesDA 2012年

1
但是它与您在基于C的语言中没有什么显着差异:/ *与//,因此我看不出它的严重程度如何。
本·罗伯茨

//,请考虑为什么有人想要多行注释。有充分的理由:...除了“我不必键入太多这些#doohickeys”和“我需要以非常精确的方式显示此特定注释,我无法真正想到任何其他方式,不允许使用前面的#。” 假设有人想做一个ASCII图,或者在出现特定问题时放一些参考javascript代码进行复制和粘贴。在这里,一种明显的执行任务的方法并不涵盖该任务的极端情况。但是,我同意其他注释样式很糟糕。
弥敦道(Nathan Basanese),2015年

3
“我不必键入许多#doohickeys”。这就是为什么几乎所有语言都有块注释(/ * .. * /)的原因。信不信由你,但是我想记录一下我的代码的作用:输入,输出,使用的算法,参数……很多文本也被修改了。仅限于单行注释只是荒谬的。请注意,我不提倡注释掉代码的方法-尽管在尝试其他方法时通常很方便,只要可以理解众所周知的可能的副作用。
艾伯特·戈德弗林德'16

3
我对python的另一点不满是它本质上是一种单人设计的语言。Guido所说的都是事实……所以我们在语言版本之间有所有这些奇怪的不兼容之处。为什么呢 因为Guido这么说...
Albert Godfrind '16

12

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

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

参见PEP 0008注释部分

并查看您的Python编辑器是否提供了一些用于块注释的键盘快捷键。Emacs以及Eclipse都支持它,大概大多数体面的IDE都支持。



5

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

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

因此,如果您的样式是前面示例的典型样式,那么仅具有单行注释并不是一件坏事,因为相比之下,您将拥有

#
# My multi-line comment in Python
#

VB.NET也是一种仅具有单行注释的语言,我个人认为它很烦人,因为注释最终看起来不像注释,而更像某种引用

'
' This is a VB.NET example
'

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



4
# This
# is
# a 
# multi-line
# comment

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


3

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


1

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

this_dict = {
    'name': 'Bob',

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

    'species': 'Cat'
}

多行注释将被塞入下一个字符串中,从而弄乱了 'species'密钥。最好仅#用于评论。


0

因为#约定是常见的约定,所以对于多行注释,您实际上无能为力,而对#符号注释则无能为力。这是历史性的意外,就像/* ... */回溯到PL / I 的评论之初一样,


0

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

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


4
这不是重点-单行注释和多行注释都有明显的用例。我已经在其他语言中广泛使用了它们(尽管我知道python pureists不在乎其他语言)。;)
johndodo 2011年

1
尝试使用200行代码来执行此操作,您必须先取出,然后放回去,然后再取出。输入200个初始#会很快变老。
DragonLord 2012年

0

这只是一个猜测..但是

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


0

此外,多行注释是一个bit子。抱歉地说,但是不管使用哪种语言,我都不会将它们用于调试目的。假设您有这样的代码:

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

然后,您会发现代码中有些内容无法使用调试器进行修复,因此您可以通过使用多行注释注释掉越来越小的代码块来开始手动调试它。然后将提供以下功能:

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

这真令人讨厌。


3
很好,但是Python没有/*样式注释。
三联画

17
是的,由于python没有真正的多行注释,因此很难在python中给出示例。
martiert 2010年

2
我个人不明白这个问题。只需删除多余的* /。或者,如果需要精确,则使用//注释掉单行。
Natalie Adams'3

4
有几种语言(无论出于何种原因都可以使用)允许嵌套注释。在rosettacode.org/wiki/Comments中搜索“嵌套” 示例。
基思

1
是的,在多行注释中添加多行注释会很烦人。虽然我一次只记得我的程序的一点点,但我至少记得我正在查看程序的哪一部分,以及我注释了什么。但是,如果您甚至不记得了,那么您可以使用某些IDE用斜体表示注释的事实。无论如何,显然对于这样一个微小的功能,您也可以使用单行注释。但是,如果要注释掉很大一部分程序,则确实需要多行注释。或具有该功能的文本编辑器。
barlop

0

使用IDLE的多行注释:

  • Mac OS X中,后选码,注释与代码块Ctrl+ 3并取消使用Ctrl+ 4

  • Windows,选择代码后,用Ctrl+ Alt+ 注释一段代码,3然后使用Ctrl+ At+ 取消注释4


-1

我记得读过一篇关于将多行注释放入三引号中的变量的家伙的文章:

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

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

通过简单地将其包装起来,注释掉代码也很容易

x = '''

'''

18
删除x =,它不会占用任何内存。
endolith 2012年
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.