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

tokenize.md

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

1> **Источник:** https://python-all.ru/3.2/library/tokenize.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 30.7. [`tokenize`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize) – Токенизатор для исходного кода Python89**Исходный код:** [Lib/tokenize.py](https://python-all.ru/src/3.2/Lib/tokenize.py)1011---1213Модуль [`tokenize`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize) предоставляет лексический анализатор для исходного кода Python, реализованный на Python. Этот анализатор также возвращает комментарии как токены, что делает его полезным для реализации «pretty-printers», включая раскраску для отображения на экране.1415Чтобы упростить обработку потока токенов, все токены [*операторов*](https://python-all.ru/3.2/reference/lexical_analysis.html#operators) и [*разделителей*](https://python-all.ru/3.2/reference/lexical_analysis.html#delimiters) возвращаются с использованием общего типа токенов [`token.OP`](https://python-all.ru/3.2/library/token.html#token.OP). Точный тип можно определить, проверив поле `string` токена в [*именованном кортеже*](https://python-all.ru/3.2/glossary.html#term-named-tuple), возвращаемом из [`tokenize.tokenize()`](https://python-all.ru/3.2/library/tokenize.html#tokenize.tokenize), по последовательности символов, которая идентифицирует конкретный токен оператора.1617Основной точкой входа является [*генератор*](https://python-all.ru/3.2/glossary.html#term-generator):1819#### `tokenize.tokenize(readline)`2021Генератор [`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize) требует один аргумент, *readline*, который должен быть вызываемым объектом, предоставляющим тот же интерфейс, что и метод [`io.IOBase.readline()`](https://python-all.ru/3.2/library/io.html#io.IOBase.readline) файловых объектов. Каждый вызов функции должен возвращать одну строку ввода в виде байтов.2223Генератор выдает 5-кортежи со следующими элементами: тип токена; строка токена; 2-кортеж `(srow, scol)` из целых чисел, указывающих строку и столбец начала токена в исходном коде; 2-кортеж `(erow, ecol)` из целых чисел, указывающих строку и столбец конца токена в исходном коде; и строку, в которой был найден токен. Передаваемая строка (последний элемент кортежа) является *логической* строкой; строки продолжения включены. 5-кортеж возвращается как [*именованный кортеж*](https://python-all.ru/3.2/glossary.html#term-named-tuple) с именами полей: `type string start end line`.2425Изменено в версии 3.1: Добавлена поддержка именованных кортежей.2627[`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize) определяет кодировку исходного файла, ища BOM UTF-8 или cookie кодировки, в соответствии с [**PEP 263**](https://python-all.ru/3.2/library/tokenize.html).2829Все константы из модуля [`token`](https://python-all.ru/3.2/library/token.html#module-token) также экспортируются из [`tokenize`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize), как и три дополнительных значения типа токена:3031#### `tokenize.COMMENT`3233Значение токена, используемое для обозначения комментария.3435#### `tokenize.NL`3637Значение токена, используемое для обозначения незавершающего перевода строки. Токен NEWLINE обозначает конец логической строки кода Python; токены NL создаются, когда логическая строка кода продолжается на нескольких физических строках.3839#### `tokenize.ENCODING`4041Значение токена, указывающее кодировку, используемую для декодирования исходных байтов в текст. Первый токен, возвращаемый [`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize), всегда будет токеном ENCODING.4243Предоставляется ещё одна функция для обращения процесса токенизации. Это полезно для создания инструментов, которые токенизируют скрипт, изменяют поток токенов и записывают изменённый скрипт обратно.4445#### `tokenize.untokenize(iterable)`4647Преобразует токены обратно в исходный код Python. *Итерируемый объект* должен возвращать последовательности как минимум из двух элементов: типа токена и строки токена. Все дополнительные элементы последовательности игнорируются.4849Восстановленный скрипт возвращается в виде одной строки. Результат гарантированно токенизируется обратно в соответствии с входными данными, что обеспечивает преобразование без потерь и полную обратимость. Гарантия распространяется только на тип токена и строку токена, поскольку расстояния между токенами (позиции столбцов) могут измениться.5051Он возвращает байты, закодированные с использованием токена ENCODING, который является первой последовательностью токенов, выводимой [`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize).5253[`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize) необходимо определять кодировку исходных файлов, которые он токенизирует. Функция, которую он для этого использует, доступна:5455#### `tokenize.detect_encoding(readline)`5657Функция [`detect_encoding()`](https://python-all.ru/3.2/library/tokenize.html#tokenize.detect_encoding) используется для определения кодировки, которая должна использоваться для декодирования исходного файла Python. Она требует один аргумент, readline, так же, как и генератор [`tokenize()`](https://python-all.ru/3.2/library/tokenize.html#module-tokenize).5859Она вызовет readline максимум дважды и вернёт используемую кодировку (в виде строки) и список любых строк (не декодированных из байтов), которые она прочитала .6061Она определяет кодировку по наличию BOM UTF-8 или cookie кодировки, как указано в [**PEP 263**](https://python-all.ru/3.2/library/tokenize.html). Если присутствуют и BOM, и cookie, но они не согласуются, будет возбуждено SyntaxError. Обратите внимание, что если BOM найден, `'utf-8-sig'` будет возвращена как кодировка.6263Если кодировка не указана, то будет возвращена кодировка по умолчанию `'utf-8'`.6465Используйте [`open()`](https://python-all.ru/3.2/library/functions.html#open) для открытия исходных файлов Python: он использует [`detect_encoding()`](https://python-all.ru/3.2/library/tokenize.html#tokenize.detect_encoding) для определения кодировки файла.6667#### `tokenize.open(filename)`6869Открывает файл в режиме только для чтения, используя кодировку, определенную [`detect_encoding()`](https://python-all.ru/3.2/library/tokenize.html#tokenize.detect_encoding).7071Новое в версии 3.2.7273Пример переписчика скриптов, преобразующего литералы чисел с плавающей запятой в объекты Decimal :7475```python76from tokenize import tokenize, untokenize, NUMBER, STRING, NAME, OP77from io import BytesIO7879def decistmt(s):80    """Заменяет значения float на Decimal.8182    >>> from decimal import Decimal83    >>> s = 'print(+21.3e-5*-.1234/81.7)'84    >>> decistmt(s)85    "print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))"8687    Формат показателя степени наследуется от библиотеки C платформы.88    Известные случаи: "e-007" (Windows) и "e-07" (не Windows). Поскольку89    мы показываем только 12 цифр, а 13-я не близка к 5, остальная90    часть вывода должна быть независимой от платформы.9192    >>> exec(s) #doctest: +ELLIPSIS93    -3.21716034272e-0...79495    Результаты вычислений с Decimal должны быть одинаковыми на всех96    платформах.9798    >>> exec(decistmt(s))99    -3.217160342717258261933904529E-7100    """101    result = []102    g = tokenize(BytesIO(s.encode('utf-8')).readline) # токенизировать строку103    for toknum, tokval, _, _, _  in g:104        if toknum == NUMBER and '.' in tokval:  # заменить токены NUMBER105            result.extend([106                (NAME, 'Decimal'),107                (OP, '('),108                (STRING, repr(tokval)),109                (OP, ')')110            ])111        else:112            result.append((toknum, tokval))113    return untokenize(result).decode('utf-8')114```115