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]) 

 
Interesting Posts for Van-Lav

Меню навигации с использованием шаблонов Django

Что такое os.linesep?

Применение одного декоратора к нескольким функциям

Какова должна быть структура проекта Python для Travis CI для поиска и запуска тестов?

Python: найдите кортежи из списка кортежей, имеющих повторяющиеся данные в 0-м элементе (кортежа)

Python: Элегантный способ проверить, соответствует ли хотя бы одно регулярное выражение в списке строке

Как реализовать безопасный сервер WebSocket (wss: //) в Python?

Есть ли быстрый способ вернуть Sin и Cos того же значения в Python?

Как получить строку даты UTC в Python?

Переместите заголовки сверху таблицы данных огурца в сторону – Python

TypeError: объект 'float' не имеет атрибута '__getitem__' в выражении while

Является ли файл pickle python кросс-платформенным?

Более быстрый способ удаления неиспользуемых категорий в пандах?

Python: найти количество вхождений заданного массива в двумерном массиве

Где функция Pydon help help получает свой контент?

Python - лучший язык программирования в мире.