Python 分词器似乎不负责显式行连接。我的意思是,如果我们在文件中写入以下代码
script.py
:
"one \
two"
然后在命令提示符下输入
python -m tokenize script.py
,我们会得到下表:
0,0-0,0: ENCODING 'utf-8'
1,0-2,4: STRING '"one \\\ntwo"'
2,4-2,5: NEWLINE '\n'
3,0-3,0: ENDMARKER ''
这意味着第二个标记包含字符串
'"one \\\ntwo"'
。但我希望它是字符串 '"one two"'
。那么,什么东西实际上处理 Python 中的显式行连接呢?也许 Python 解析器可以做到这一点?维基百科有一些关于一般编程上下文中的评估阶段的文字(即它没有具体谈论Python),但这个描述对我来说不是很清楚,我无法想出更多的例子(除了字符串文字中的显式行连接之外),当 Python 中需要进行此类潜在评估时。这种评估阶段的存在意味着解析器不会直接从标记器获取输入......
编辑。我还测试了 Python 分词器如何处理字符串文字外部的显式行连接。我进去了
2 + \
3
并获得以下代币:
0,0-0,0: ENCODING 'utf-8'
1,0-1,1: NUMBER '2'
1,2-1,3: OP '+'
2,0-2,1: NUMBER '3'
2,1-2,2: NEWLINE '\n'
3,0-3,0: ENDMARKER ''
在这种情况下,分词器只是删除了
\
符号,正如我所料。
您的观察是准确的:Python 中显式行连接的处理是微妙的,并且涉及语言处理的多个阶段。
Tokenizer:处理行连续字符(
\
)的初始识别,但不会在字符串文字中解析它们,导致标记仍然包含转义序列。
解析器: 解析字符串文字中的行延续,将
\\n
解释为实际的换行符,并在 STRING 标记的上下文中适当地连接行。
运行时:执行解析的代码,根据需要解释和评估字符串文字。
举个例子:
"one \
two"
代币化:
STRING: '"one \\\ntwo"'
解析:
解析器处理 STRING 标记,解析行延续,并有效地将其视为:
"one two"
评价:
执行时,按原样使用字符串文字“一二”。
另请注意,在没有字符串文字的情况下,通常,分词器步骤本身会根据需要将转义序列删除,除了解析步骤按照上述说明进行操作的字符串文字之外。