好的,我知道三引号字符串可以用作多行注释。例如,
"""Hello, I am a
multiline comment"""
和
'''Hello, I am a
multiline comment'''
但从技术上讲,这些是字符串,对吗?
我已经用谷歌搜索并阅读了 Python 样式指南,但我无法找到关于为什么没有正式实现多行、/* */ 注释类型的技术答案。我使用三引号没有问题,但我有点好奇是什么导致了这个设计决定。
我怀疑你会得到比“Guido 觉得不需要多行注释”更好的答案。
Guido 曾在推特上发表过这样的评论:
Python 提示:您可以使用多行字符串作为多行注释。除非用作文档字符串,否则它们不会生成任何代码!:-)
多行注释很容易被破坏。如果您在一个简单的计算器程序中有以下内容怎么办?
operation = ''
print("Pick an operation: +-*/")
# Get user input here
尝试用多行注释来评论它:
/*
operation = ''
print("Pick an operation: +-*/")
# Get user input here
*/
糟糕,您的字符串包含结束注释分隔符。
三引号文本不应被视为多行注释;按照惯例,它们是docstrings。他们应该描述你的代码做什么以及如何使用它,而不是像注释掉代码块这样的事情。
根据 Guido 的说法,Python 中的多行注释只是连续的单行注释(搜索“块注释”)。
为了注释代码块,我有时使用以下模式:
if False:
# A bunch of code
这可能会回到核心概念,即应该有一种明显的方式来完成一项任务。额外的注释样式会增加不必要的复杂性,并可能降低可读性。
好吧,三引号用作文档字符串中的多行注释。并且 # 注释用作内联注释,人们习惯了它。
大多数脚本语言也没有多行注释。也许这就是原因?
参见PEP 0008,注释部分
看看你的 Python 编辑器是否提供了一些用于块注释的键盘快捷键。Emacs 和 Eclipse 都支持它,大概大多数像样的 IDE 都支持。
来自Python 之禅:
应该有一种——最好只有一种——明显的方法来做到这一点。
要在Pycharm IDE 中注释掉一段代码:
就我个人而言,我在说 Java 时的评论风格就像
/*
* My multi-line comment in Java
*/
所以如果你的风格是前面例子的典型风格,那么只有单行注释并不是一件坏事,因为相比之下你会有
#
# My multi-line comment in Python
#
VB.NET 也是一种只有单行评论的语言,我个人觉得这很烦人,因为评论最终看起来不像是喜欢的评论,而更像是某种引用
'
' This is a VB.NET example
'
单行注释最终比多行注释使用更少的字符,并且可能不太可能被正则表达式语句中的一些狡猾的字符转义?不过,我倾向于同意内德的观点。
# This
# is
# a
# multi-line
# comment
在您的编辑器中使用注释块或搜索和替换 (s/^/#/g) 来实现此目的。
我通过为我的文本编辑器 (TextPad) 下载一个宏来解决这个问题,它可以让我突出显示行,然后在每行的第一行插入 #。一个类似的宏删除了#。有些人可能会问为什么多行是必要的,但当您尝试“关闭”一段代码以进行调试时,它会派上用场。
对于在 Python 中寻找多行注释的任何其他人 - 使用三引号格式可能会产生一些问题,因为我刚刚学会了艰难的方法。考虑一下:
this_dict = {
'name': 'Bob',
"""
This is a multiline comment in the middle of a dictionary
"""
'species': 'Cat'
}
多行注释将被塞进下一个字符串,弄乱了
'species'
键。最好只#
用于评论。
做一件事应该只有一种方法,这与使用多行字符串和单行字符串或 switch/case 以及不同形式的循环相矛盾。
多行注释是一个非常常见的功能,让我们面对现实吧,多行字符串注释是一种带有负面影响的 hack!我已经看到很多代码在使用多行注释技巧,甚至编辑器也使用它。
但我猜每种语言都有它的怪癖,开发者坚持从不修复它。我也知道 java 方面的这些怪癖,自 90 年代后期以来一直开放,永远不会被修复!
假设它们只是被认为是不必要的。由于只需键入非常容易,因此#a comment
多行注释可以只包含许多单行注释。
另一方面,对于HTML ,更需要多线程。继续打字更难<!--comments like this-->
。
这只是一个猜测..但是
因为它们是字符串,所以它们具有一些语义价值(编译器不会删除它们),因此将它们用作文档字符串是有意义的。它们实际上成为AST的一部分,因此提取文档变得更容易。
因为# 约定是一个常见的约定,并且对于多行注释确实没有什么可以用#-sign 注释做的。这是一个历史性的意外,就像/* ... */
评论的祖先可以追溯到 PL/I,
此外,多行注释是个婊子。很抱歉,但不管是哪种语言,除了调试目的之外,我不会将它们用于任何其他目的。假设你有这样的代码:
void someFunction()
{
Something
/*Some comments*/
Something else
}
然后你发现你的代码中有一些东西你不能用调试器修复,所以你开始手动调试它,用这些多行注释注释掉越来越小的代码块。这将给出函数:
void someFunction()
{ /*
Something
/* Comments */
Something more*/
}
这真的很烦人。
使用IDLE的多行注释:
Mac OS X,在代码选择之后,使用 + 注释代码块Ctrl并3使用Ctrl+取消注释4。
Windows,在代码选择后,用Ctrl++注释代码块并使用Alt++取消注释。3CtrlAt4
我记得读过一个人将他的多行评论放入三引号变量中:
x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''
这确实占用了一些内存,但它为您提供了多行注释功能,而且大多数编辑器会为您突出显示语法:)
通过简单地包装代码也很容易注释掉代码
x = '''
和
'''