为什么会这样
if 1 \
and 0:
pass
最简单的代码阻塞令牌化/无法识别循环
import tokenize
import cStringIO
def tok_untok(src):
f = cStringIO.StringIO(src)
return tokenize.untokenize(tokenize.generate_tokens(f.readline))
src='''if 1 \\
and 0:
pass
'''
print tok_untok(src)
它抛出:
AssertionError:
File "/mnt/home/anushri/untitled-1.py", line 13, in <module>
print tok_untok(src)
File "/mnt/home/anushri/untitled-1.py", line 6, in tok_untok
tokenize.untokenize(tokenize.generate_tokens(f.readline))
File "/usr/lib/python2.6/tokenize.py", line 262, in untokenize
return ut.untokenize(iterable)
File "/usr/lib/python2.6/tokenize.py", line 198, in untokenize
self.add_whitespace(start)
File "/usr/lib/python2.6/tokenize.py", line 187, in add_whitespace
assert row <= self.prev_row
是否有解决方法而没有修改src以进行标记化(似乎\
是罪魁祸首)
失败的另一个例子是最后没有新行,例如src='if 1:pass'
失败并出现同样的错误
解决方法: 但它似乎使用不同的方式工作
def tok_untok(src):
f = cStringIO.StringIO(src)
tokens = [ t[:2] for t in tokenize.generate_tokens(f.readline)]
return tokenize.untokenize(tokens)
即。不要传回整个令牌元组,而只传递t [:2]
尽管python doc表示会跳过额外的参数
将标记转换回Python源代码。迭代必须返回 具有至少两个元素的序列, 令牌类型和令牌字符串。 任何其他序列元素 忽略。