python,x = “”“”“”;lexed为三引号或三对引号

python, x = “”“”“”; lexed as triple quotes or 3 pairs of quotes

在Python中,你可以这么说:

1
x ="""""" # x = ''

这是一个词法分析器为蟒湖只是三重引号里面?IU在x =""""""线(在没有空间)?

这是我早期的思想。然而,这是可能的:在Python

1
2
3
4
5
>>>"4""5"
'45'
>>> # and
>>>"4""5"
'45'

所以我可以看到,x =""""""lexed可能是沿着线的x =""""""(在没有空间)。我只是想知道,是""""""lexed为双或三对三的报价,报价,正常吗?完全或什么?谢谢!

编辑:显然,它没有作为一个Python程序员的t物。然而,Python解释器和必须选择一个我想它。


你可以通过使用记号赋予器来判断:

1
2
3
4
5
6
7
8
9
10
11
>>> from StringIO import StringIO
>>> from tokenize import generate_tokens as gt
>>> from pprint import pprint as pp
>>> code = 'x=""""""'
>>> codeio = StringIO(code)
>>> tokens = list(gt(codeio.readline))
>>> pp(tokens)
[(1, 'x', (1, 0), (1, 1), 'x=""""""'),
 (51, '=', (1, 1), (1, 2), 'x=""""""'),
 (3, '""""""', (1, 2), (1, 8), 'x=""""""'),
 (0, '', (2, 0), (2, 0), '')]

第一个标记是"x"。第二个是"=",第三个是"""。没有三个""'标记。

比较P.S.:

1
2
3
4
5
6
7
8
9
>>> 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), '')]

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

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

解析器在读取一个引号时,会检查同一类型的两个以上的引号,如果找到它们,则只在三个以上的连续引号上终止字符串。否则,它会终止下一个引号上的字符串,除非前面有一个换行符,在这种情况下,它会产生一个错误。


它只标识为一对三引号。

检查这个

1
2
3
4
5
6
7
8
>>> id("""""")
140579203310856

>>> id("")
140579203310856

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

这基本上意味着,这对三重引号的标识与正常引号相同。

另外,如果您执行两个双引号的ID,如下所示

1
2
>>> id("""")
....

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


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

1
2
3
4
5
6
>>>"""abc"""
'abc'
>>>"a""b""c"
'abc'
>>>"a""b""c" =="""abc"""
True

您可以使用ast模块来查看python为此使用的语法树。例如:

1
2
3
4
5
>>> import ast
>>> source = '""""""""'
>>> node = ast.parse(source, mode='eval')
>>> ast.dump(node)
"Expression(body=Str(s=''))"

如您所见,它是一个空字符串。