32.7. tokenize – Токенизатор для исходного кода Python¶tokenize – Tokenizer for Python source
Исходный код: Lib/tokenize.py
Модуль tokenize предоставляет лексический сканер для исходного кода Python,
реализованный на Python. Сканер в этом модуле также возвращает комментарии в качестве токенов,
что делает его полезным для реализации «pretty-printers», включая подсветку для экранного отображения.
Для упрощения обработки потока токенов все токены операторов и разделителей возвращаются с использованием общего типа токена token.OP. Точный тип можно определить, проверив второе поле (содержащее фактическую строку совпавшего токена) кортежа, возвращаемого из tokenize.generate_tokens() для последовательности символов, идентифицирующей конкретный токен оператора.
Основной точкой входа является генератор:
-
tokenize.generate_tokens(readline)¶ Генератор
generate_tokens()требует один аргумент, readline, который должен быть вызываемым объектом, предоставляющим тот же интерфейс, что и методreadline()встроенных файловых объектов (см. раздел Файловые объекты). Каждый вызов функции должен возвращать одну строку ввода в виде строки. Альтернативно, readline может быть вызываемым объектом, который сигнализирует о завершении, вызываяStopIteration.Генератор возвращает кортежи из 5 элементов со следующими составляющими: тип токена; строка токена; кортеж из двух целых чисел
(srow, scol), определяющий строку и столбец, где токен начинается в исходном коде; кортеж из двух целых чисел(erow, ecol), определяющий строку и столбец, где токен заканчивается в исходном коде; и строка, в которой был найден токен. Переданная строка (последний элемент кортежа) является логической строкой; строки продолжения включены.Новое в версии 2.2.
Старая точка входа сохранена для обратной совместимости:
-
tokenize.tokenize(readline[, tokeneater])¶ Функция
tokenize()принимает два параметра: один представляет входной поток, а другой предоставляет механизм вывода дляtokenize().Первый параметр, readline, должен быть вызываемым объектом, предоставляющим тот же интерфейс, что и метод
readline()встроенных файловых объектов (см. раздел Файловые объекты). Каждый вызов функции должен возвращать одну строку ввода в виде строки. Альтернативно, readline может быть вызываемым объектом, который сигнализирует о завершении, вызываяStopIteration.Изменено в версии 2.5: Добавлена поддержка
StopIteration.Второй параметр, tokeneater, также должен быть вызываемым объектом. Он вызывается один раз для каждого токена с пятью аргументами, соответствующими кортежам, сгенерированным
generate_tokens().
Все константы из модуля token также экспортируются из tokenize, как и два дополнительных значения типа токена, которые могут быть переданы функции tokeneater через tokenize():
-
tokenize.COMMENT¶ Значение токена, используемое для обозначения комментария.
-
tokenize.NL¶ Значение токена, используемое для обозначения незавершающего перевода строки. Токен NEWLINE указывает конец логической строки кода Python; токены NL генерируются, когда логическая строка кода продолжается на нескольких физических строках.
Предоставляется ещё одна функция для обращения процесса токенизации. Это полезно для создания инструментов, которые токенизируют скрипт, изменяют поток токенов и записывают изменённый скрипт обратно.
-
tokenize.untokenize(iterable)¶ Преобразует токены обратно в исходный код Python. Итерируемый объект должен возвращать последовательности как минимум из двух элементов: тип токена и строка токена. Любые дополнительные элементы последовательности игнорируются.
Восстановленный скрипт возвращается в виде одной строки. Гарантируется, что результат при обратной токенизации совпадёт с входными данными, так что преобразование является без потерь, и обратимые преобразования обеспечены. Гарантия распространяется только на тип токена и строку токена, поскольку расстояние между токенами (положение столбцов) может измениться.
Новое в версии 2.5.
-
exception
tokenize.TokenError¶ Возникает, когда докстринг или выражение, которое может быть разбито на несколько строк, не завершено нигде в файле, например:
"""Beginning of docstring
или:
[1, 2, 3
Обратите внимание, что незакрытые строки в одинарных кавычках не вызывают
ошибки. Они токенизируются как ERRORTOKEN, а затем токенизируется их содержимое.
Пример перезаписывателя скриптов, преобразующего литералы с плавающей запятой в объекты Decimal:
def decistmt(s):
"""Заменяет значения float на Decimal.
>>> from decimal import Decimal
>>> s = 'print +21.3e-5*-.1234/81.7'
>>> decistmt(s)
print +Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7')
>>> exec(s)
-3.21716034272e-007
>>> exec(decistmt(s))
-3.217160342717258261933904529E-7
"""
result = []
g = generate_tokens(StringIO(s).readline) # токенизировать строку
for toknum, tokval, _, _, _ in g:
if toknum == NUMBER and '.' in tokval: # заменить токены NUMBER
result.extend([
(NAME, 'Decimal'),
(OP, '('),
(STRING, repr(tokval)),
(OP, ')')
])
else:
result.append((toknum, tokval))
return untokenize(result)