在使用Python的tokenize模块更改某些元素后,我尝试重建一行python代码。简单的标记化/取消标记化不会重建原始代码,而是在输出中添加额外的空格。
untokenize
中是否有错误,或者我缺少什么?
from tokenize import tokenize, untokenize
from io import BytesIO
def retoken(text):
result = []
g = tokenize(BytesIO(text.encode('utf-8')).readline) # tokenize the string
for toknum, tokval, _, _, _ in g:
result.append((toknum, tokval))
return untokenize(result).decode('utf-8')
code = "x.y=12"
print("CODE:", code)
print("RETOKEN:", retoken(code))
输出:
CODE: x.y=12
RETOKEN: x .y =12
答案 0 :(得分:1)
untokenize
的文档指出
[...]标记之间的间距(列位置)可能会改变。
我怀疑untokenize
在构建其输出字符串时不会检查其整个令牌列表。它似乎在标识符标记之后添加了一个空格,因为保证该字符不属于先前的标识符标记或它后面的任何标记,也不会成为标记本身。这有助于确保tokenize(untokenize(tokenize(s))) == tokenize(s)
,即使untokenize(tokenize(s))
可能不等于s
。