python, x = “”“”“”; lexed as triple quotes or 3 pairs of quotes
在Python中,你可以这么说:
1 | x ="""""" # x = '' |
这是一个词法分析器为蟒湖只是三重引号里面?IU在
这是我早期的思想。然而,这是可能的:在Python
1 2 3 4 5 | >>>"4""5" '45' >>> # and >>>"4""5" '45' |
所以我可以看到,
编辑:显然,它没有作为一个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 |
您可以使用
1 2 3 4 5 | >>> import ast >>> source = '""""""""' >>> node = ast.parse(source, mode='eval') >>> ast.dump(node) "Expression(body=Str(s=''))" |
如您所见,它是一个空字符串。