Python3.0 – tokenize и 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 = 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 

Я искал ссылки на эту ошибку и ее причины, но не смог ее найти. Что я делаю неправильно и как я могу это исправить?

[редактировать]

После того как замечание Партианна о том, что добавление новой строки к источнику приводит к ошибке, я начал возиться со списком, который я не открывал. Кажется, что токен 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 Solutions collect form web for “Python3.0 – tokenize и untokenize”

 src = 'foo="bar"\n' 

Вы забыли новую строку.

Если вы ограничите ввод, чтобы не 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) 
  • Модификации Python 2 newline в модуле токенизации
  • Заполнение нескольких символов пробелом - python
  • Токизация арабских слов с использованием NLTK
  • Как я могу разбить строку математических выражений в python?
  • Написание токенизатора в Python
  • NLTK regexp tokenizer не играет хорошо с десятичной точкой в ​​регулярном выражении
  • tokenize строку, содержащую разделители в Python
  • Python - лучший язык программирования в мире.