我可以在三重引号字符串的开头添加额外的引号,但不能在结尾添加。为什么会这样?这段代码:
print(""""
String that starts with quadruple quotes and ends with triple quotes
""")
生成以下输出:
"
String that starts with quadruple quotes and ends with triple quotes
然而,这个代码块不起作用:
print(""""
String that starts with quadruple quotes and ends with quadruple quotes
"""")
它会产生这样的错误:
File "example.py", line 3
"""")
^
SyntaxError: EOL while scanning string literal
我从来不需要使用四引号字符串,但我很好奇为什么Python不让我这样做。有人能帮我理解吗?
5条答案
按热度按时间oxcyiej71#
不能在三重引号字符串的值中使用
"""
anywhere。一开始没有,最后也没有。这是因为,在
"""
的前三个开头字符表示这样一个字符串的开始之后,"""
的 * 另一个 * 序列总是成为字符串的结尾。第四个"
位于您创建的字符串对象之外,没有结束"
的单个"
不是有效字符串。Python没有其他方法知道这样的字符串何时结束。你不能在最后一个
"""
之前任意扩展字符串“inward”,因为这将与有效的和法律的 * 无法区分:如果必须在结束符
"""
之前包含"
,请将其转义。你可以在它前面加上一个反斜杠:请注意,没有 * 四引号字符串 * 这样的东西。Python不允许您任意将合并
"
引号组合成更长的序列。只有"single quoted"
和"""triple-quoted"""
语法存在(使用"
或'
)。三引号字符串的规则不同于单引号字符串;在前者中允许使用换行符,而在后者中不允许。有关更多详细信息,请参阅参考文档的 String and String literals 部分,其中将语法定义为:
并明确提到:
在三重引号的字面量中,允许(并保留)未转义的换行符和引号,除非连续三个未转义的引号终止字面量。(“引号”是用于打开文字的字符,即
'
或"
)。(bold强调我的)。
"""
引号引起来,另一个用"
引号引起来。连接字符串字面量自动连接,就像在C中一样。参见 String literal concatenation。jm2pwxwz2#
它被解析为
triple-quote text triple-quote quote
(triple-quote
首先是最大的munch规则)。您可以转义四个引号中的第一个来解决这个问题。xfb7svmp3#
一个三重引号的字符串以一系列3个非转义的匹配引号结束。
当一个字符串文字以4个引号开始时,前3个开始是一个三引号的字符串文字,下一个引号只是字符串的一部分,因为一行中必须有三个引号才能结束字符串。
当你试图用4个引号结束一个字符串时,前三个引号结束了字符串,第四个引号开始了一个新的字符串。新的字符串字面量没有结束引号,这是一个语法错误。
w9apscun4#
你得到一个错误,因为你还没有关闭第二组引号。
在字符串的开头,有四个引号。其中三个打开弦。下一个引号包含在字符串中,因为它后面没有另外两个引号。
在字符串的末尾,有四个引号。其中前三个结束字符串。第四个打开一个新的单引号字符串。你没有在行尾结束字符串,所以你得到一个错误。
(It实际上,在它们旁边有两个字符串并不是错误。Python将在编译时将它们连接起来。)
我从来不需要使用四引号字符串,但我很好奇为什么Python不让我这样做。
因为四重引号字符串不是一个东西。Python不让你这么做,因为它不是设计来做的。你可以有单引号字符串,也可以有三引号字符串。任何其他数量的报价都是正确的。
tez616oj5#
不幸的是,我没有回答为什么这样一个带有四个尾随撇号的字面量实现的问题,而是回答了“如何使用转义实现字面量”的问题,或者回答了近似这样的问题-“因为它是这样实现的”。在我看来,我已经找到了答案。它是通过Python中的另一个操作实现的-即,不使用“+”符号连接两个字面值。例如,“F”“A”==“F””A”==“FA”。因此,一行中有8个撇号的文字“可以有不同的解释。顺便说一句,令人惊讶的是,现在8”不会产生错误,而是返回一个空的文字。
如果你认为我的想法是正确的,请给予我的question1和question2加一个加号,因为我仍然因为这样的态度而感到痛苦,因为我希望即使在文档中也有Python完美的逻辑。