Python3.0 - トークン化とuntokenize
-
06-09-2019 - |
質問
私は大きなファイルからの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 のの観察は、私がいじり始めた後、リストは私がuntokenizingました。すぐにそれがエラーを取り除く取り除く改行が先行していない場合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])
解決
src = 'foo="bar"\n'
You改行を忘れてしまった。
他のヒント
あなたは、トークンの最初の2つの項目に
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)
所属していません StackOverflow