字符串字面量——三引号编码多行块字符串 | 第二部分 类型与操作 —— 第 7 章: 字符串基础 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载
到目前为止,已经见过实战中的单引号、双引号,转义和原始字符串。python还有一个三引号的字符串字面量格式,有时被称为块字符串,它是为编码多行文本数据的语法糖。这个形式开始于三个引号(不管单双),跟着是任意数量的文本行,然后以同样的开启多行字符串的三引号序列结束。嵌套在字符串文本中的单双引号可能,但并不必须被转义——字符串不会结束,直到碰到用来开始多行字符串的同种类型的三个未转义引号。比如(这里的"..."是在idle外的python连续行的提示符:不用自己键入):
>>> mantra = """always look
... on the bright
... side of life."""
>>>
>>> mantra
'always look\n on the bright\nside of life.'
这个字符串跨越了3行。在第3章学习了:在一些界面中,交互式提示符在像这样的连续行上变为...
,但idle只是简单地下移一行;本书以两种格式显示代码列表,所以请按需推断。不管哪种方式,python都将所有三引号括起来的文本放入一个单独的多行字符串,在代码有换行的地方嵌入换行符(\n
)。注意,和字面量一样,结果中第二行有前导空格,但第三行没有——键入的真的就是得到的。要看到换行符被解释的字符串,打印它而非回显:
>>> print(mantra)
always look
on the bright
side of life.
事实上,三引号字符串会保留所有被包裹的文本,包含任何在代码右边的可能本想作为注释的文字。所以不要这么做——将注释放在引号括起来文本的上面或下面,或使用之前提到的邻近字符的自动连接(如果想要加上明确换行)和周围的小括号来让行扩展到多行上(再说一次,关于后面这个形式的更多知识请参见第10,12章中的语法规则):
>>> menu = """spam # comments here added to string!
... eggs # ditto
... """
>>> menu
'spam # comments here added to string!\neggs #
ditto\n'
>>> menu = (
... "spam\n" # comments here ignored
... "eggs\n" # but newlines not automatic
... )
>>> menu
'spam\neggs\n'
三引号字符串在程序中需要多行文本的任何时候都是有用的;比如,在python源码文件中嵌入多行错误信息或html,xml或json代码。可以通过三引号直接在脚本中嵌入这些代码块而无需依靠外部文本文件或明确连接和换行符号。
import json
# define a multiline json code block using triple-quoted strings
json_data = '''
{
"name": "john doe",
"age": 35,
"email": "[email protected]",
"address": {
"street": "123 main st",
"city": "anytown",
"state": "ca",
"zip": "12345"
}
}
'''
# load the json data from the string
data = json.loads(json_data)
# print the data
print(data)
三引号字符还常用于文档字符串,它们是字符串字面量,当他们出现在文件的特定点时是作为注释的(关于这些的更多见本书后面)。文档字符串不需要是三引号块,但它们通常可以是(三引号块)来允许多行注释。
def multiply(a, b):
"""
multiply two numbers and return the result.
parameters:
a (int): the first number to multiply.
b (int): the second number to multiply.
returns:
int: the result of multiplying a and b.
"""
return a * b
最后,三引号字符串有时还被用作一种”可怕的骇客式“方法来临时禁用开发期间的代码行(好吧,它并不真的可怕,而且在今天它真的是一个相当普遍的实践,但禁用代码行并不是它的本意)。如果希望关闭一些代码行然后再次运行代码,简单地在它们上下各放三个引号,如下:
x = 1
"""
import os # 临时禁用代码
print(os.getcwd())
"""
y = 2
我说这是骇客式的,因为python真的可能将这种方式禁用的代码行作为字符串字面量,但从性能来说,这并不重要。对大段代码,它还比手动在每行前面添加#号然后再移除它们要更简单。如果你正在使用一个没有专门支持python代码的编辑器,这会特别有用。在python中,实用性经常大于美学。