爲什麼會這樣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源代碼。迭代器必須返回至少包含兩個元素的 序列,即標記類型和標記字符串 。 忽略任何其他序列元素 。
它在Python 2.5中工作正常,在2.7引發AssertionError。 – TryPyPy 2011-01-19 12:58:31