2

次の簡略化されたスクリプトに似たものを使用して、より大きなファイルから 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])
4

2 に答える 2

3

src = 'foo="bar"\n'
改行を忘れました。

于 2009-06-01T12:49:16.163 に答える
0

untokenize入力をトークンの最初の 2 項目に制限すると、機能するようです。

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)
于 2009-06-01T12:48:53.857 に答える