如何使用tokezine/untokenize?

How to use tokezine/untokenize?

我试图在使用 Python 的标记化模块更改一些元素后重建一行 python 代码。一个简单的 tokenize/untokenize 不会重建原始代码,它会在输出中添加额外的空格。

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

untokenize 的文档指出

[...] the spacing between tokens (column positions) may change.

我怀疑 untokenize 在构建其输出字符串时没有检查其整个标记列表。它似乎在标识符标记之后添加了一个 space ,因为该字符保证不会成为前面的标识符标记或其后面的任何标记的一部分,或者是标记本身。这有助于确保 tokenize(untokenize(tokenize(s))) == tokenize(s),即使 untokenize(tokenize(s)) 可能不等于 s.