如何使用tokezine / untokenize?

时间:2019-04-05 21:25:35

标签: python tokenize

在使用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

1 个答案:

答案 0 :(得分:1)

untokenize的文档指出

  

[...]标记之间的间距(列位置)可能会改变。

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