tokenize — Токенизатор для исходного кода Python

Модуль tokenize представляет собой лексический сканер для исходного кода на Python, реализованный на Python. Сканер этого модуля возвращает комментарии как токены, что полезно для реализации “красивого вывода (pretty-printers)”, включая цветной вывод.

Главной точкой входа является генератор:

tokenize.generate_tokens(readline)[source]

Генератор generate_tokens() требует один аргумент, readline, который должен быть вызываемым объектом, который предоставляет тот же интерфейс, как и метод readline() встроенных файловых объектов (смотри раздел bltin-file-objects). Каждый вызов функции должен возвращать одну строку ввода как string.

Генератор создаёт кортеж из 5 элементов с таким содержимым: тип токена; строка токена; кортеж с 2-мя числами (srow, scol), определяющими строку и столбец, в котором начинается этот токен в исходном файле; кортеж с двумя числами (erow, ecol), определящими строку и столбец, где токен заканчивается в исходном коде; и строку, в которой токен был найден. Передаваемая строка (последний элемент кортежа) - логическая строка; строки-продолжения в неё так же включены.

New in version 2.2.

Старая точка входа сохранена для обеспечения обратной совместимости:

tokenize.tokenize(readline[, tokeneater])[source]

Функция tokenize() принимает два параметра: первый представляет собой поток ввода, а второй - механизм вывода для tokenize().

Первый параметр, readline, должен быть вызываемым объектом, который предоставляет тот же интерфейс, что и метод readline() встроенного объекта файла (смотрите раздел bltin-file-objects). Каждый вызов этого метода должен возвращать строку ввода. Или же, readline может быть вызываемым объектом, который сообщает о завершении ввода при помощи вызова исключения StopIteration.

Changed in version 2.5: Добавлена поддержка StopIteration.

Второй параметр, tokeneater, тоже должен быть вызываемым объектом. Он вызывается один раз для каждого токена, принимает пять аргументов, соответствующих кортежу, генерируемому generate_tokens().

Все константы из модуля token также импортируются модулем tokenize, как и два дополнительных типа токенов, которые могут быть переданы в функцию tokeneater функцией tokenize():

tokenize.COMMENT

Значение токена, которое используется для обозначения комментария.

tokenize.NL

Значения токена, которое используется для обозначения не прерывающей новой строки. Токен NEWLINE обозначает конец логичской строки кода Python. Токен NL генерируется когда логическая строка кода продолжается на нескольких физических строках.

Другая функция предоставляется для обращения процесса создания токентов. Она полезна для создания инструмента, который токенизирует скрипт, изменяет поток токенов и записывает изменённый скрипт.

tokenize.untokenize(iterable)[source]

Преобразует токены обратно в код Python. iterable должен возвращать последовательность как минимум из двух элементов: типа токена и строки токена. Все остальные элементы последовательности игнорируются.

Воссозданный скрпит возвращается одной строкой. Полученный результат гарантированно можно обратно токенизировать, так что преобразования осуществляются без потерь. Однако, гарантия распространяется только на тип токена и строку токена, тогда как пространства между токенами (позиция в столбце) может изменяться.

New in version 2.5.

Пример скрипта-передельщика, который трансформирует float литералы в объекты Decimal:

def decistmt(s):
    """Заменяет float на  Decimals for в строке выражения.

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