为什么在Python 3中四重引号会产生一个错误?

mitkmikd  于 2023-10-21  发布在  Python
关注(0)|答案(5)|浏览(193)

我可以在三重引号字符串的开头添加额外的引号,但不能在结尾添加。为什么会这样?这段代码:

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不让我这样做。有人能帮我理解吗?

oxcyiej7

oxcyiej71#

不能在三重引号字符串的值中使用"""anywhere。一开始没有,最后也没有。
这是因为,在"""的前三个开头字符表示这样一个字符串的开始之后,"""的 * 另一个 * 序列总是成为字符串的结尾。第四个"位于您创建的字符串对象之外,没有结束"的单个"不是有效字符串。
Python没有其他方法知道这样的字符串何时结束。你不能在最后一个"""之前任意扩展字符串“inward”,因为这将与有效的和法律的 * 无法区分:

>>> """string 1"""" string 2"
'string 1 string 2'

如果必须在结束符"""之前包含",请将其转义。你可以在它前面加上一个反斜杠:

>>> """This is triple-quoted string that
... ends in a single double quote: \""""
'This is triple-quoted string that\nends in a single double quote: "'

请注意,没有 * 四引号字符串 * 这样的东西。Python不允许您任意将合并"引号组合成更长的序列。只有"single quoted""""triple-quoted"""语法存在(使用"')。三引号字符串的规则不同于单引号字符串;在前者中允许使用换行符,而在后者中不允许。
有关更多详细信息,请参阅参考文档的 String and String literals 部分,其中将语法定义为:

shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'

并明确提到:
在三重引号的字面量中,允许(并保留)未转义的换行符和引号,除非连续三个未转义的引号终止字面量。(“引号”是用于打开文字的字符,即'")。
(bold强调我的)。

  • 该表达式是法律的,因为它由两个字符串文字组成,一个用"""引号引起来,另一个用"引号引起来。连接字符串字面量自动连接,就像在C中一样。参见 String literal concatenation
jm2pwxwz

jm2pwxwz2#

它被解析为triple-quote text triple-quote quotetriple-quote首先是最大的munch规则)。您可以转义四个引号中的第一个来解决这个问题。

xfb7svmp

xfb7svmp3#

一个三重引号的字符串以一系列3个非转义的匹配引号结束。
当一个字符串文字以4个引号开始时,前3个开始是一个三引号的字符串文字,下一个引号只是字符串的一部分,因为一行中必须有三个引号才能结束字符串。
当你试图用4个引号结束一个字符串时,前三个引号结束了字符串,第四个引号开始了一个新的字符串。新的字符串字面量没有结束引号,这是一个语法错误。

w9apscun

w9apscun4#

你得到一个错误,因为你还没有关闭第二组引号。
在字符串的开头,有四个引号。其中三个打开弦。下一个引号包含在字符串中,因为它后面没有另外两个引号。
在字符串的末尾,有四个引号。其中前三个结束字符串。第四个打开一个新的单引号字符串。你没有在行尾结束字符串,所以你得到一个错误。
(It实际上,在它们旁边有两个字符串并不是错误。Python将在编译时将它们连接起来。)
我从来不需要使用四引号字符串,但我很好奇为什么Python不让我这样做。
因为四重引号字符串不是一个东西。Python不让你这么做,因为它不是设计来做的。你可以有单引号字符串,也可以有三引号字符串。任何其他数量的报价都是正确的。

tez616oj

tez616oj5#

不幸的是,我没有回答为什么这样一个带有四个尾随撇号的字面量实现的问题,而是回答了“如何使用转义实现字面量”的问题,或者回答了近似这样的问题-“因为它是这样实现的”。在我看来,我已经找到了答案。它是通过Python中的另一个操作实现的-即,不使用“+”符号连接两个字面值。例如,“F”“A”==“F””A”==“FA”。因此,一行中有8个撇号的文字“可以有不同的解释。顺便说一句,令人惊讶的是,现在8”不会产生错误,而是返回一个空的文字。
如果你认为我的想法是正确的,请给予我的question1question2加一个加号,因为我仍然因为这样的态度而感到痛苦,因为我希望即使在文档中也有Python完美的逻辑。

相关问题