好的,我知道三引号字符串可以用作多行注释。例如,
1 2
| """Hello, I am a
multiline comment""" |
和
1 2
| '''Hello, I am a
multiline comment''' |
但从技术上讲,这些都是弦,对吗?
我已经在谷歌上搜索并阅读了Python风格指南,但是我找不到一个技术答案来解释为什么没有正式实现多行,/**/类型的注释。我使用三重引号没有问题,但是我有点好奇是什么导致了这个设计决策。
- 如果你能把它作为一个字符串来做,为什么还要添加更多的方法呢?
- 只是想补充一点,如果您试图评论的内容碰巧也有注释/多行字符串,那么它将失败。当然,这就是我们需要它们的原因。
- @我认为这是一个有用的问题。为了理解为什么Python是好的,理解所做的设计决策(以及正在进行的决策)是很重要的。这个问题不是争论性的,也不是好斗的;它是好奇的。不必对好奇心那么苛刻。
- 如果你的代码已经有多行注释,那么同样的假设也适用。
- 如果您需要对COD进行多行注释,只需if False:代码
- @因为字符串被处理。注释被忽略。使用字符串作为注释时出现问题。看看周围:)
我怀疑你会得到比"guido不觉得需要多行评论"更好的答案。
guido已经在tweet上发布了以下信息:
Python tip: You can use multi-line strings as multi-line comments. Unless used as docstrings, they generate no code! :-)
- 看看吉多的推特。
- 混合多行字符串和块注释的一个缺点是,IDE不知道您想要什么,因此不能根据需要以不同的样式显示注释。
- 它还使得用多行字符串注释代码变得不可能(如果不小心,可能导致缩进错误)。电子战!
- 我在很多领域工作过,如果你的代码包含注释掉的代码,那么你的代码就会被拒绝,你甚至会发现自己被邀请更新你的简历。或者删除不需要的代码,如果代码在版本控制下,则不是问题,或者在需要禁用的代码之前使用if False:。
- @Stevenbarnes同意生产中大量注释掉的代码是不好的。但我不明白为什么if False更好。它完成了完全相同的事情,但不太清楚(因为一眼就不那么明显,代码块已被禁用)。
- @Dan1111-我个人更喜欢删除残留代码,如果需要的话,你可以随时从风投那里得到它。评论应该是评论。
- @Stevenbarnes是的,我同意(尽管在开发过程中临时评论是有用的)。但是考虑到有人在注释一段代码。我不知道为什么if False更好。
- 有些人更喜欢如果是错误的:带有注释为什么-因为很明显,代码不会被执行,但不会与注释混淆。很多IDE都允许您打开或关闭对代码块的注释。
- @史蒂文巴恩斯感谢你在任何情况下为我们决定这些事情——就像吉多那样。我在最大的公司工作过,有很多时间和地点可以达到这种严格程度。而不是…
- @Javadba-很荣幸我可以和Guido相比,我不是在口授,而是解释决定背后的原因。在我研究过的一些行业中,注释掉的代码是被拒绝的原因——同样,从未执行和测试过的代码也是——例如,对这两种代码都有misra规则。
- @史蒂文·巴恩斯,这是不允许的@google:I think I'm getting a little over engined here:You're correct in this.
多行注释很容易破坏。如果在一个简单的计算器程序中有以下内容呢?
1 2 3
| operation = ''
print("Pick an operation: +-*/")
# Get user input here |
尝试用多行注释对此进行注释:
1 2 3 4 5
| /*
operation = ''
print("Pick an operation: +-*/")
# Get user input here
*/ |
糟糕,您的字符串包含结束注释分隔符。
- 关于这个答案,最美妙的是它是如何被SO的语法高亮处理的。
- 我甚至没注意到…我休息一下。:)
- 这是我们有转义字符的众多原因之一,我不认为这是不支持多行注释的一个好理由。
- 这里没有转义字符会有帮助。如果字符串中的*/被转义为允许注释,则在未注释时,它将显示在字符串中。否则它会破坏评论。如果您想为字符串添加更多转义以允许注释,我认为这会给语言的字符串语法增加不必要的复杂性。
- 我不明白你的逻辑——也许我的评论不够清楚。如果我们将用作转义字符:print("pick an operation:+-*/")"*/"不再表示将按字面/将要打印的结束注释块。"在C++中进行测试。事实上,So的语法高亮显示将显示这是有效的。这不是一门复杂的学科,它在其他语言中存在了多年。我会要求你更新你的文章,包括使用转义字符来显示你可以在代码中使用"*/"。
- @纳塔那达姆斯:是的,现在你已经在字符串中引入了另一个转义符,你只需要使用它,因为多行评论很糟糕,就像我说的。那原始弦呢?那些人也会逃跑吗(这是他们唯一的一次逃跑),或者他们还是被打破了?
- 在多行注释中,还需要转义哪些字符?
- 如果代码包含"",该怎么办?对不起,您的代码包含结束注释分隔符
- 多行注释本身并不容易破坏;只是它们的大多数实现都是(包括Python的实现)。在我看来,在python中进行多行注释的明显方法就是让我用#:启动一个注释块,并使用缩进来显示注释结束的时间。它干净、一致,能完美地处理嵌套。
- 在D中你可以使用/++/无耻的广告
- 对疑问思维的一些解释:当然,这会破坏多行注释,因为解析器在第一次遇到"/*"后处于"寻找关闭*/"模式(也就是说)。但是,如果您将opening'/*'放在字符串中,所有操作都将正常,并且注释不会被弄乱。
- 那是个做作的例子
- - 1。这个问题是用C语言解决的,或者可能是它的一个前辈。所以从1972年起,这个答案就失效了。
- 我认为,任何一行注释语法也同样"容易被新行字符打断"…(?)我的意思是…如果我们谈论的是非常小的、罕见的和可寻址的边缘案例…
三重引号文本不应被视为多行注释;按照惯例,它们是docstring。它们应该描述代码的功能和使用方法,但不能用于注释代码块之类的事情。
根据guido,python中的多行注释只是连续的单行注释(搜索"block comments")。
为了注释代码块,我有时使用以下模式:
1 2
| if False:
# A bunch of code |
- 似乎吉多从那时起就开始改变主意了。
- 关于"if-false:"解决方案,问题是在Python中,当它与制表符一起工作时,您必须在"if-false:"下的所有代码中制表。然后解开那块。所以你必须对你的文本编辑器相当漂亮。
- 如果你用的是一个得体的编辑,那么时间应该和*/
- @巴洛普,是的-学习你的编辑!这通常可以在不到一秒钟的时间内用V}>>在VIM中实现。
这很可能回到核心概念,即应该有一种显而易见的方法来完成任务。附加的注释样式会增加不必要的复杂性,并可能降低可读性。
- 这就是问题所在,我认为:使用字符串作为注释并不明显,并且违反了"单向执行任务"原则,因为有两种方法可以执行注释:字符串和#。
- 但是它与基于C语言的语言没有显著的区别:/*vs//,所以我看不出它有多糟糕。
- //,考虑为什么有人想要多行注释。有充分的理由:除了"我不需要输入这么多的"和"我需要以非常精确的方式显示这个特定的注释,并且这种精确的方式不允许前面的"之外,我真的想不出还有什么别的了。比如有人想做一个ASCII图,或者在出现特定问题时放一些参考的javascript代码来复制和粘贴。在这里,完成一项任务的一个显而易见的方法不包括该任务的边缘情况。不过,我同意附加的评论风格是不好的。
- "我不必打这么多的这些涂鸦"。这正是几乎所有语言都有块注释的原因(/*..*/)。信不信由你,但我喜欢记录我的代码的功能:输入、输出、使用的算法、参数……很多文本也会被修改。仅限于单行评论的限制是非常荒谬的。请注意,我并不提倡使用注释代码的方法——尽管在尝试其他方法时,这通常很方便,只要知道已知的可能的副作用。
- 我对Python的另一个不满是它本质上是一种由一个人设计的语言。吉多说的都是事实…所以我们有语言版本之间所有奇怪的不兼容性。为什么?因为吉多这么说…
好吧,在docstrings中,三引号用作多行注释。并且注释被用作内联注释,人们会习惯它。
大多数脚本语言也没有多行注释。也许是因为这个?
见PEP 0008,章节注释
看看你的python编辑器是否提供了块注释的快捷键。Emacs支持它,也支持Eclipse,大概大多数合适的IDE都支持。
来自Python禅:
应该有一种——最好只有一种——显而易见的方法来做到这一点。
个人而言,我的评论风格就像Java一样
1 2 3
| /*
* My multi-line comment in Java
*/ |
因此,如果您的风格与前面的示例相比是典型的,那么只有一行注释并不是一件坏事,因为相比之下,您可以
1 2 3
| #
# My multi-line comment in Python
# |
vb.net也是一种只有一行注释的语言,我个人认为它很烦人,因为注释最后看起来不太喜欢注释,更像某种引用。
1 2 3
| '
' This is a VB.NET example
' |
单行注释的字符使用量比多行注释少,而且在regex语句中不太可能被一些不可靠的字符转义?不过,我倾向于同意内德的观点。
在Pycharm IDE中注释一块代码:
- 代码带行注释的注释
- Windows或Linux:ctrl+/
- Mac操作系统:commandakbd+/
1 2 3 4 5
| # This
# is
# a
# multi-line
# comment |
使用注释块或在编辑器中搜索并替换(s/^//g)来实现这一点。
我通过下载文本编辑器(textpad)的宏解决了这个问题,它允许我突出显示行,然后在每行的第一行插入。类似的宏删除了。有些人可能会问为什么需要多行,但当您试图"关闭"用于调试的代码块时,它非常有用。
此外,多行评论是一个婊子。很抱歉,不管使用哪种语言,我都不会将它们用于调试以外的任何用途。假设你有这样的代码:
1 2 3 4 5 6
| void someFunction()
{
Something
/*Some comments*/
Something else
} |
然后你发现你的代码中有一些你不能用调试器修复的东西,所以你开始手动调试它,通过注释出越来越小的代码块,并使用多行注释。这将提供以下功能:
1 2 3 4 5 6
| void someFunction()
{ /*
Something
/* Comments */
Something more*/
} |
这真让人恼火。
- 很好,但是python没有/*风格的注释。
- 对,因为python没有真正的多行注释,所以在python中很难给出示例。
- 我个人不理解这个问题。只需删除多余的*/。或者,如果需要精确的话,可以使用//注释单行。
- 允许嵌套注释的语言有几种(其中许多是出于任何原因而起作用的)。在rosettacode.org/wiki/comments中搜索"嵌套"以获取示例。
- 是的,把多行评论放在多行评论中会让人恼火。虽然我一次只记得我的程序的一部分,但我至少记得我正在看程序的哪个部分,所以我已经把它注释掉了。但是如果你甚至记不起来,那么你可以使用这样一个事实:一些IDES将注释改为斜体。显然,对于这样一个小函数,您也可以使用单行注释。但是,如果对一大块程序进行注释,那么您真的需要多行注释。或者一个具有该功能的文本编辑器。
因为约定是一种常见的约定,而且对于多行注释,您确实没有任何可以做的事情,而对于符号注释,您不能做。这是一个历史性的意外,就像/* ... */的祖先评论回到损益表,
这只是个猜测……但是
因为它们是字符串,所以它们有一些语义值(编译器不会去掉它们),因此将它们用作docstring是有意义的。它们实际上是AST的一部分,因此提取文档变得更容易。
假设他们被认为是不必要的。由于只键入#a comment很容易,所以多行注释只能由许多单行注释组成。
另一方面,对于HTML,更需要多行。很难继续输入。
- 这不是重点——对于单行和多行注释都有明显的用例。我已经在其他语言中广泛使用了它们(尽管我知道Python纯粹主义者不关心其他语言)。;)
- 试着用200行代码来做这个,你必须取出,放回去,然后再取出。输入200个首字母会很快变老。
- 找个像样的编辑?;)
使用IDLE ON的多行注释:
我记得我读过一个家伙,他会把他的多行评论放到一个三重引用的变量中:
1 2 3 4 5 6
| x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
''' |
这确实占用了一些内存,但它提供了多行注释功能,而且大多数编辑器都会为您突出显示语法:)
简单地将代码包装在
和