Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рыжий Лис
Просто Лис
1187 / 511 / 343
Регистрация: 17.05.2012
Сообщений: 2,066
Записей в блоге: 8
1

Untokenize теряет лексему INDENT

07.05.2016, 13:04. Просмотров 157. Ответов 1

Доброго времени суток.

Понадобилось преобразовать питоновский код в лексемы, сделать какие-то действия и собрать обратно. Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# coding: utf-8
from io import BytesIO
from code import InteractiveConsole
from token import *
from tokenize import tokenize, untokenize
 
 
def readfunc(prompt):  # вызываем эту функцию
    string = input(prompt)
    tokens = get_tokenize(string)
    print('tokens:', tokens)
    res = get_untokenize(tokens)
    print('res:', res)
    return res
 
 
def get_tokenize(string):
    g = tokenize(BytesIO(string.encode('utf-8')).readline)
    return [(toknum, tokval) for toknum, tokval, _, _, _ in g]
 
 
def get_untokenize(tokens):
    return untokenize(tokens).decode('utf-8')  # здесь неправильно работает
Пример работы программы:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> 1+2
tokens: [(56, 'utf-8'), (2, '1'), (52, '+'), (2, '2'), (0, '')]
res: 1 +2 
3
> if True:
tokens: [(56, 'utf-8'), (1, 'if'), (1, 'True'), (52, ':'), (0, '')]
res: if True :
.     pass
tokens: [(56, 'utf-8'), (5, '    '), (1, 'pass'), (6, ''), (0, '')]
res: pass 
  File "<console>", line 2
    pass
       ^
IndentationError: expected an indented block
>
Выше видно что строка " pass" успешно разбилась на следующие лексемы:
* (56, 'utf-8')
* (5, ' ') - INDENT
* (1, 'pass') - NAME
* (6, '') - DEDENT
* (0, '') - ENDMARKER

Однако при сборке кода из лексем получается другая строка: "pass" (и это неправильно).

Подскажите почему теряются пробелы в начале строки?

Добавлено через 4 часа 9 минут
Всё оказалось не так просто, как казалось вначале. Пока сделал так:
Python
1
2
3
def get_tokenize(string):
    g = tokenize(BytesIO(string.encode('utf-8')).readline)
    return [t for t in g]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2016, 13:04
Ответы с готовыми решениями:

Многопроцессорный парсер теряет ссылки при паринге (selenium+PhantomJS+ProcessPoolExecutor)
Я хочу написать парер для некоторого вебсайта, который имеет много JS кодов....

Opera. textarea text-indent
В опере для textarea не работает text-indent. Мне нужно обязательно чтобы был...

Конфликт Опера с text-indent
Страница соостоит из трех колонок, в одной из которых имеется текст и...

Ссылка на неразрешенную лексему
Доброе время суток, у меня возникла такая проблема // ------ Построение...

Разбить лексему на подлексемы
Подскажите, как разбить лексему на подлексемы. int i = 0; char* m;...

1
alex925
2671 / 2278 / 630
Регистрация: 19.03.2012
Сообщений: 8,830
07.05.2016, 18:36 2
В этом видео https://www.youtube.com/watch?v=Zv6yT-ytIvg затрагивается интересующая тебя тема, посмотри, возможно найдешь ответ.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2016, 18:36

Баг со свойством text-indent в Safari
Привет нужна помощь с версткой в Safari криво работает отступ у input свойство...

расширения Indent Guides для brackets
Кто знает как уменьшить отступы во вложениях расширения Indent Guides?

Как вывести на экран k-ую лексему?
Как вывести на екран k-тую лексему ? Добавлено через 14 минут :wall:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru