質問

私は大きなファイルからの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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top