2011-01-19 49 views
1

爲什麼會這樣python tokenize中的錯誤?

if 1 \ 
and 0: 
    pass 

簡單的記號化/ untokenize週期代碼扼流圈

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'失敗,同樣的錯誤

解決方法: 但似乎使用untokenize不同的方式工作

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說多餘的ARGS被跳過

將轉換令牌返回到Python源代碼。迭代器必須返回至少包含兩個元素的 序列,即標記類型和標記字符串 。 忽略任何其他序列元素 。

+0

它在Python 2.5中工作正常,在2.7引發AssertionError。 – TryPyPy 2011-01-19 12:58:31

回答

3

是的,這是一個known bug,並且有一個比那個問題附加的更清晰的補丁感興趣。完美的時間來貢獻一個更好的Python;)

+0

查看我的編輯解決方法,因此修復可能很容易 – 2011-01-19 13:16:07