> **Источник:** https://python-all.ru/2.7/library/tokenize.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 32.7. [`tokenize`](https://python-all.ru/2.7/library/tokenize.html#module-tokenize) – Токенизатор для исходного кода Python

**Исходный код:** [Lib/tokenize.py](https://python-all.ru/src/2.7/Lib/tokenize.py)

---

Модуль [`tokenize`](https://python-all.ru/2.7/library/tokenize.html#module-tokenize) предоставляет лексический сканер для исходного кода Python, реализованный на Python. Сканер в этом модуле также возвращает комментарии в качестве токенов, что делает его полезным для реализации «pretty-printers», включая подсветку для экранного отображения.

Для упрощения обработки потока токенов все токены [операторов](https://python-all.ru/2.7/reference/lexical_analysis.html#operators) и [разделителей](https://python-all.ru/2.7/reference/lexical_analysis.html#delimiters) возвращаются с использованием общего типа токена [`token.OP`](https://python-all.ru/2.7/library/token.html#token.OP). Точный тип можно определить, проверив второе поле (содержащее фактическую строку совпавшего токена) кортежа, возвращаемого из [`tokenize.generate_tokens()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.generate_tokens) для последовательности символов, идентифицирующей конкретный токен оператора.

Основной точкой входа является [генератор](https://python-all.ru/2.7/glossary.html#term-generator):

#### `tokenize.generate_tokens(readline)`

Генератор [`generate_tokens()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.generate_tokens) требует один аргумент, *readline*, который должен быть вызываемым объектом, предоставляющим тот же интерфейс, что и метод [`readline()`](https://python-all.ru/2.7/library/stdtypes.html#file.readline) встроенных файловых объектов (см. раздел [Файловые объекты](https://python-all.ru/2.7/library/stdtypes.html#bltin-file-objects)). Каждый вызов функции должен возвращать одну строку ввода в виде строки. Альтернативно, *readline* может быть вызываемым объектом, который сигнализирует о завершении, вызывая [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration).

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

Новое в версии 2.2.

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

#### `tokenize.tokenize(readline[, tokeneater])`

Функция [`tokenize()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.tokenize) принимает два параметра: один представляет входной поток, а другой предоставляет механизм вывода для [`tokenize()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.tokenize).

Первый параметр, *readline*, должен быть вызываемым объектом, предоставляющим тот же интерфейс, что и метод [`readline()`](https://python-all.ru/2.7/library/stdtypes.html#file.readline) встроенных файловых объектов (см. раздел [Файловые объекты](https://python-all.ru/2.7/library/stdtypes.html#bltin-file-objects)). Каждый вызов функции должен возвращать одну строку ввода в виде строки. Альтернативно, *readline* может быть вызываемым объектом, который сигнализирует о завершении, вызывая [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration).

Изменено в версии 2.5: Добавлена поддержка [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration).

Второй параметр, *tokeneater*, также должен быть вызываемым объектом. Он вызывается один раз для каждого токена с пятью аргументами, соответствующими кортежам, сгенерированным [`generate_tokens()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.generate_tokens).

Все константы из модуля [`token`](https://python-all.ru/2.7/library/token.html#module-token) также экспортируются из [`tokenize`](https://python-all.ru/2.7/library/tokenize.html#module-tokenize), как и два дополнительных значения типа токена, которые могут быть переданы функции *tokeneater* через [`tokenize()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.tokenize):

#### `tokenize.COMMENT`

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

#### `tokenize.NL`

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

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

#### `tokenize.untokenize(iterable)`

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

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

Новое в версии 2.5.

#### `exception tokenize.TokenError`

Возникает, когда докстринг или выражение, которое может быть разбито на несколько строк, не завершено нигде в файле, например:

```python
"""Beginning of
docstring
```

или:

```python
[1,
 2,
 3
```

Обратите внимание, что незакрытые строки в одинарных кавычках не вызывают ошибки. Они токенизируются как `ERRORTOKEN`, а затем токенизируется их содержимое.

Пример перезаписывателя скриптов, преобразующего литералы с плавающей запятой в объекты Decimal:

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