Документация Python неофициальный перевод

tokenize.md

109 строк · 10.3 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/tokenize.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 32.7. [`tokenize`](https://python-all.ru/2.7/library/tokenize.html#module-tokenize) – Токенизатор для исходного кода Python89**Исходный код:** [Lib/tokenize.py](https://python-all.ru/src/2.7/Lib/tokenize.py)1011---1213Модуль [`tokenize`](https://python-all.ru/2.7/library/tokenize.html#module-tokenize) предоставляет лексический сканер для исходного кода Python, реализованный на Python. Сканер в этом модуле также возвращает комментарии в качестве токенов, что делает его полезным для реализации «pretty-printers», включая подсветку для экранного отображения.1415Для упрощения обработки потока токенов все токены [операторов](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) для последовательности символов, идентифицирующей конкретный токен оператора.1617Основной точкой входа является [генератор](https://python-all.ru/2.7/glossary.html#term-generator):1819#### `tokenize.generate_tokens(readline)`2021Генератор [`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).2223Генератор возвращает кортежи из 5 элементов со следующими составляющими: тип токена; строка токена; кортеж из двух целых чисел `(srow, scol)`, определяющий строку и столбец, где токен начинается в исходном коде; кортеж из двух целых чисел `(erow, ecol)`, определяющий строку и столбец, где токен заканчивается в исходном коде; и строка, в которой был найден токен. Переданная строка (последний элемент кортежа) является *логической* строкой; строки продолжения включены.2425Новое в версии 2.2.2627Старая точка входа сохранена для обратной совместимости:2829#### `tokenize.tokenize(readline[, tokeneater])`3031Функция [`tokenize()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.tokenize) принимает два параметра: один представляет входной поток, а другой предоставляет механизм вывода для [`tokenize()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.tokenize).3233Первый параметр, *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).3435Изменено в версии 2.5: Добавлена поддержка [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration).3637Второй параметр, *tokeneater*, также должен быть вызываемым объектом. Он вызывается один раз для каждого токена с пятью аргументами, соответствующими кортежам, сгенерированным [`generate_tokens()`](https://python-all.ru/2.7/library/tokenize.html#tokenize.generate_tokens).3839Все константы из модуля [`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):4041#### `tokenize.COMMENT`4243Значение токена, используемое для обозначения комментария.4445#### `tokenize.NL`4647Значение токена, используемое для обозначения незавершающего перевода строки. Токен NEWLINE указывает конец логической строки кода Python; токены NL генерируются, когда логическая строка кода продолжается на нескольких физических строках.4849Предоставляется ещё одна функция для обращения процесса токенизации. Это полезно для создания инструментов, которые токенизируют скрипт, изменяют поток токенов и записывают изменённый скрипт обратно.5051#### `tokenize.untokenize(iterable)`5253Преобразует токены обратно в исходный код Python. *Итерируемый объект* должен возвращать последовательности как минимум из двух элементов: тип токена и строка токена. Любые дополнительные элементы последовательности игнорируются.5455Восстановленный скрипт возвращается в виде одной строки. Гарантируется, что результат при обратной токенизации совпадёт с входными данными, так что преобразование является без потерь, и обратимые преобразования обеспечены. Гарантия распространяется только на тип токена и строку токена, поскольку расстояние между токенами (положение столбцов) может измениться.5657Новое в версии 2.5.5859#### `exception tokenize.TokenError`6061Возникает, когда докстринг или выражение, которое может быть разбито на несколько строк, не завершено нигде в файле, например:6263```python64"""Beginning of65docstring66```6768или:6970```python71[1,72 2,73 374```7576Обратите внимание, что незакрытые строки в одинарных кавычках не вызывают ошибки. Они токенизируются как `ERRORTOKEN`, а затем токенизируется их содержимое.7778Пример перезаписывателя скриптов, преобразующего литералы с плавающей запятой в объекты Decimal:7980```python81def decistmt(s):82    """Заменяет значения float на Decimal.8384    >>> from decimal import Decimal85    >>> s = 'print +21.3e-5*-.1234/81.7'86    >>> decistmt(s)87    print +Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7')8889    >>> exec(s)90    -3.21716034272e-00791    >>> exec(decistmt(s))92    -3.217160342717258261933904529E-79394    """95    result = []96    g = generate_tokens(StringIO(s).readline)   # токенизировать строку97    for toknum, tokval, _, _, _  in g:98        if toknum == NUMBER and '.' in tokval:  # заменить токены NUMBER99            result.extend([100                (NAME, 'Decimal'),101                (OP, '('),102                (STRING, repr(tokval)),103                (OP, ')')104            ])105        else:106            result.append((toknum, tokval))107    return untokenize(result)108```109