python中的错误令牌化?

时间:2011-01-19 12:53:26

标签: python tokenize

为什么会这样

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源代码。迭代必须返回   具有至少两个元素的序列,   令牌类型和令牌字符串。   任何其他序列元素   忽略。

1 个答案:

答案 0 :(得分:3)

是的,这是一个known bug,并且有一个更清洁的补丁而不是附加到该问题的补丁。为更好的Python做出贡献的最佳时机;)