python,x="&引用&引用&引用&引用&“;;词法为三重引号或三对引号

python,x="&引用&引用&引用&引用&“;;词法为三重引号或三对引号,python,Python,在python中,您可以这样说: x = """""" # x = '' Python lexer是否将其视为两个三重引号,里面没有任何内容?即沿着x=“””(没有空格)的线条 这是我当时的想法。但是,这在python中是可能的: >>> "4" "5" '45' >>> # and >>> "4""5" '45' 因此,我可以看到,x=“”“也可以按照x=“””(没有空格)的行进行词法分析。 我只是想知道,“是两个三重引号还是三对普通引

在python中,您可以这样说:

x = """""" # x = ''
Python lexer是否将其视为两个三重引号,里面没有任何内容?即沿着
x=“””
(没有空格)的线条

这是我当时的想法。但是,这在python中是可能的:

>>> "4" "5"
'45'
>>> # and
>>> "4""5"
'45'
因此,我可以看到,
x=“”“
也可以按照
x=“””
(没有空格)的行进行词法分析。 我只是想知道,
是两个三重引号还是三对普通引号?或者完全是别的什么?谢谢


编辑:显然,作为Python程序员,这并不重要。然而,Python解释器肯定必须选择其中一个,我想知道是哪一个

它在词汇上是一个字符串。三引号字符串是唯一可以跨多行的形式(不同于其他一些语言,它们允许所有字符串或不允许任何字符串跨行)

之所以选择这种特殊语法,可能是因为它使语法突出显示变得简单,标记匹配的引号对。尽管这仍然会错误地突出显示无效的python(跨行的单引号字符串),但通常对于文本编辑器来说已经足够了

解析器在读取一个引号时,会检查是否还有两个相同类型的引号,如果找到它们,则只在另外三个连续引号上终止字符串。否则,它会在下一个引号中终止字符串,除非先有换行符,否则会产生错误。

您可以使用以下命令来判断:

第一个标记是“x”。第二个是“=”,第三个是““””。没有三个“””标记

p.S.供比较:

>>> othercode='y="led" "zeppelin"'
>>> othercodeio = StringIO(othercode)
>>> othertokens = list(gt(othercodeio.readline))
>>> pp(othertokens)
[(1, 'y', (1, 0), (1, 1), 'y="led" "zeppelin"'),
 (51, '=', (1, 1), (1, 2), 'y="led" "zeppelin"'),
 (3, '"led"', (1, 2), (1, 7), 'y="led" "zeppelin"'),
 (3, '"zeppelin"', (1, 8), (1, 18), 'y="led" "zeppelin"'),
 (0, '', (2, 0), (2, 0), '')]

您可以使用
ast
模块查看python用于此目的的语法树。e、 g:

导入ast >>>源=“”“” >>>node=ast.parse(源,mode='eval') >>>ast.dump(节点) “表达式(body=Str(s=”)”
如您所见,它是一个空字符串。

它仅被标识为一对三引号

检查这个

>>> id("""""")
140579203310856

>>> id("")
140579203310856

>>> id("" "" "")
140579203310856
这基本上意味着,这对三引号的标识与普通引号相同

另外,如果您使用两个双引号的id,如下所示

>>> id("""")
....

它不会终止,因为lexer现在将其视为docstring,并希望该字符串有效终止。

如果没有文本,则是相同的。 请尝试以下操作:

>>> """abc"""
'abc'
>>> "a""b""c"
'abc'
>>> "a""b""c" == """abc"""
True

阿瓦尔?您是否感到困惑,python没有右值。@IfLoop修复了这个问题,抱歉,我认为我使用的术语是正确的。我想知道您在找什么有关系吗?无论哪种方式,都会得到空字符串。这两种解释之间没有区别-三个空字符串仍然是空字符串
“*3==”=“=”=“=”
”。对于任何非空示例,可以清楚地看到正在使用的是哪一个,尽管它们仍然相等:
“f”“o”“o”==“foo”“”==“foo”
“并且希望字符串的另两个引号有效终止”。。不,它期望字符串有3个连续的引号有效终止。字符串结尾的3个引号必须同时出现,您不能分期付款。@user9876好的,我们都错了。我刚试过。3个引号也不起作用,因为最初有一个第4个引号字符是在未替换的情况下输入的。现在想弄清楚,这并不能证明什么。你试过id(“”)吗?@user9876原来是4个引号<代码>id(“”“”)在扫描字符串文字时计算时出错
语法错误:EOL
因此
也被标识为一对三引号”?:-)当您到达Python对象级别时(经过词法分析、解析到具体语法树、转换到抽象语法树、编译到字节码、解释该字节码),
之间的区别早已消失。通过查看生成的Python对象的ID,您无法说明标记器如何处理
”!
>>> """abc"""
'abc'
>>> "a""b""c"
'abc'
>>> "a""b""c" == """abc"""
True