Python3.0 - 词法分析与反词法分析
我正在使用类似下面这个简化的脚本,从一个较大的文件中提取Python代码片段:
import io
import tokenize
src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)
src = list(tokenize.tokenize(src.readline))
for tok in src:
print(tok)
src = tokenize.untokenize(src)
虽然这个代码在python2.x中不完全一样,但用法是相似的,运行起来也没问题。不过,当我用python3.0运行上面的代码片段时,得到了这样的输出:
(57, 'utf-8', (0, 0), (0, 0), '')
(1, 'foo', (1, 0), (1, 3), 'foo="bar"')
(53, '=', (1, 3), (1, 4), 'foo="bar"')
(3, '"bar"', (1, 4), (1, 9), 'foo="bar"')
(0, '', (2, 0), (2, 0), '')
Traceback (most recent call last):
File "q.py", line 13, in <module>
src = tokenize.untokenize(src)
File "/usr/local/lib/python3.0/tokenize.py", line 236, in untokenize
out = ut.untokenize(iterable)
File "/usr/local/lib/python3.0/tokenize.py", line 165, in untokenize
self.add_whitespace(start)
File "/usr/local/lib/python3.0/tokenize.py", line 151, in add_whitespace
assert row <= self.prev_row
AssertionError
我查找了关于这个错误及其原因的资料,但一直找不到相关信息。我哪里做错了,应该怎么修正呢?
[编辑]
在partisann指出在源代码后面加一个换行符可以解决这个错误后,我开始对我正在处理的列表进行调整。似乎如果EOF
这个标记前面没有换行符,就会导致错误,所以去掉它就能消除这个错误。以下脚本运行时没有错误:
import io
import tokenize
src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)
src = list(tokenize.tokenize(src.readline))
for tok in src:
print(tok)
src = tokenize.untokenize(src[:-1])
2 个回答
0
如果你把输入限制在untokenize
的前两个元素上,它似乎就能正常工作了。
import io
import tokenize
src = 'foo="bar"'
src = bytes(src.encode())
src = io.BytesIO(src)
src = list(tokenize.tokenize(src.readline))
for tok in src:
print(tok)
src = [t[:2] for t in src]
src = tokenize.untokenize(src)
3
src = 'foo="bar"\n'
你忘记加换行符了。