为啥 python 在注释中使用非常规的三引号?
Posted
技术标签:
【中文标题】为啥 python 在注释中使用非常规的三引号?【英文标题】:Why does python use unconventional triple-quotation marks for comments?为什么 python 在注释中使用非常规的三引号? 【发布时间】:2011-10-26 19:30:03 【问题描述】:为什么 python 不直接使用 C/C++/Java 等传统风格的 cmets:
/**
* Comment lines
* More comment lines
*/
// line comments
// line comments
//
这是有特定原因还是只是随意的?
【问题讨论】:
什么? Python 使用 # cmets,这是许多语言的常见做法。 我是指以"""
开头的多行cmets 我相信...
我知道#
用于其他语言(我知道 bash 使用它)。
那些不是 cmets,它们是文档字符串。
它们不是文档字符串。它们通常用于文档字符串,因此字符串更易于阅读。
【参考方案1】:
Guido - Python 的创造者,实际上在这里讨论了这个话题: https://twitter.com/gvanrossum/status/112670605505077248?lang=en
总之 - 对于多行 cmets,只需使用三引号。出于学术目的 - 是的,它技术上是一个字符串,但它被忽略了,因为它从未被使用或分配给变量。
【讨论】:
【参考方案2】:一些答案得到了很多分数,但没有给出事情如何运作的完整视图。总结一下……
# comment
是 Python 执行实际 cmets 的方式(类似于 bash 和其他一些语言)。 Python 只有“到行尾”的 cmets,它没有明确的多行注释包装器(与 javascript 的 /* .. */
相反)。大多数 Python IDE 允许您一次选择并评论一个块,这就是处理这种情况的人数。
然后是普通的单行python字符串:它们可以使用'
或"
引号(例如'foo'
"bar"
)。这些的主要限制是它们不会跨越多行。这就是多行字符串的用途:它们是由三个单引号或双引号('''
或"""
)包围的字符串,并且仅在找到匹配的非转义终止符时才终止。它们可以根据需要进行任意多行,并包括所有中间空格。
这两种字符串类型中的任何一种都定义了一个完全正常的字符串对象。可以为它们分配一个变量名,对它们应用运算符等。一旦解析,任何格式之间都没有区别。但是,根据字符串的位置以及它的使用方式,有两种特殊情况......
首先,如果一个字符串刚刚写下来,没有应用额外的操作,也没有分配给一个变量,它会发生什么?当代码执行时,裸字符串基本被丢弃。因此,人们发现使用多行字符串注释掉大量 Python 代码很方便(前提是您可以转义任何内部多行字符串)。这并不常见,或者语义上不正确,但它是允许的。
第二个用途是,在def Foo()
、class Foo()
或模块开头之后立即 之后的任何此类裸字符串都被视为包含该对象文档的字符串,并且存储在对象的__doc__
属性中。这是最常见的情况,字符串看起来像是“注释”。不同之处在于,它们作为已解析代码的一部分发挥着积极作用,存储在__doc__
...中,并且与注释不同,它们可以在运行时读取。
【讨论】:
“可以存储在变量中” Python 中没有可访问的变量可以放入和取出值。只有对象。 确实如此。术语可能有点过于非正式,但我试图让我的回答不要持续太久。 “可以在本地范围字典中的命名键下存储对自身的引用”可能更接近事实,但相当罗嗦,遗憾的是我想不出一个令人满意的中间立场来引用这样的操作 @987654333 @ 指令a = "century"
是赋值,相关过程是名称和对象的绑定【参考方案3】:
大多数脚本语言使用 # 作为注释标记,因此会自动跳过向程序加载器指定要运行的解释器的 shebang (#!)(如在 #!/bin/bash 中)。或者,可以指示解释器自动跳过第一行,但将 # 定义为注释标记就更方便了,因此它被跳过了。
【讨论】:
【参考方案4】:三引号不是 cmets。它们是string literals,跨越多行并在结果字符串中包含这些换行符。这允许您使用
somestr = """This is a rather long string containing
several lines of text just as you would do in C.
Note that whitespace at the beginning of the line is\
significant."""
而不是
somestr = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
Note that whitespace at the beginning of the line is\
significant."
【讨论】:
【参考方案5】:Python 不对 cmets 使用三引号。评论使用井号(又名磅)字符:
# this is a comment
三引号是doc string,与注释不同,它实际上可以作为程序的真实字符串使用:
>>> def bla():
... """Print the answer"""
... print 42
...
>>> bla.__doc__
'Print the answer'
>>> help(bla)
Help on function bla in module __main__:
bla()
Print the answer
不严格要求使用三引号,只要它是一个字符串。使用"""
只是一种约定(并且具有多行的优点)。
【讨论】:
"不严格要求使用三引号,只要它是一个字符串。使用 """ 只是一种约定。" 嗯,很好。我不知道! OIC 现在...在问这个问题之前我应该自己做更多的研究...不过谢谢! 优秀的答案。我补充说,当您想注释掉某些行以进行调试时,通常也将字符串用作快速而脏的多行 cmets。 很好的示例代码,但是这个答案缺少我一直在寻找的一个细节,@eli-collins 在下面的答案中提到了这一点:“@ 之后 立即 之后的裸字符串987654325@、class Foo()
或模块的开头,被视为包含该对象文档的字符串,并存储在对象的“__doc__
”属性中。
澄清@RemingtonSteed 提到的内容:当它是“模块、函数、类或方法定义”中的第一条语句时,字符串文字仅被解释为文档字符串(python.org)。因此,您可以在所有其他情况下像注释一样使用它,并且它不可作为运行时对象属性访问。以上是关于为啥 python 在注释中使用非常规的三引号?的主要内容,如果未能解决你的问题,请参考以下文章