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

tokenize.md

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

1> **Источник:** https://python-all.ru/3.0/library/tokenize.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `tokenize` – токенизатор исходного кода Python89Модуль `tokenize` предоставляет лексический сканер для исходного кода Python, реализованный на Python. Сканер в этом модуле также возвращает комментарии как токены, что позволяет использовать его для реализации «pretty-printers», включая цветовые подсветки для экранных дисплеев.1011Основной точкой входа является [*генератор*](https://python-all.ru/3.0/glossary.html#term-generator):1213#### `[tokenize.tokenize]tokenize.tokenize(readline)`1415Генератор [`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize) требует один аргумент, *readline*, который должен быть вызываемым объектом с тем же интерфейсом, что и метод `readline()` встроенных файловых объектов (см. раздел [*Файловые объекты*](https://python-all.ru/3.0/library/stdtypes.html#bltin-file-objects)). Каждый вызов функции должен возвращать одну строку ввода в виде байтов.1617Генератор выдаёт кортежи из 5 элементов: тип токена; строка токена; кортеж из двух целых чисел `(srow, scol)`, задающий строку и столбец начала токена в исходнике; кортеж из двух целых чисел `(erow, ecol)`, задающий строку и столбец конца токена; и строка, в которой был найден токен. Передаваемая строка (последний элемент кортежа) – это *логическая* строка; строки продолжения включаются.1819[`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize) определяет кодировку исходного файла, ища BOM UTF-8 или cookie кодировки, в соответствии с [**PEP 263**](https://python-all.ru/3.0/library/tokenize.html).2021Все константы из модуля [`token`](https://python-all.ru/3.0/library/token.html#module-token) также экспортируются из `tokenize`, как и три дополнительных значения типа токена:2223#### `[tokenize.COMMENT]tokenize.COMMENT`2425Значение токена, используемое для обозначения комментария.2627#### `[tokenize.NL]tokenize.NL`2829Значение токена, используемое для обозначения незавершающего перевода строки. Токен NEWLINE обозначает конец логической строки кода Python; токены NL создаются, когда логическая строка кода продолжается на нескольких физических строках.3031#### `[tokenize.ENCODING]tokenize.ENCODING`3233Значение токена, указывающее кодировку, используемую для декодирования исходных байтов в текст. Первый токен, возвращаемый3435[`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize)3637, всегда будет токеном ENCODING.3839Предоставляется ещё одна функция для обращения процесса токенизации. Это полезно для создания инструментов, которые токенизируют скрипт, изменяют поток токенов и записывают изменённый скрипт обратно.4041#### `[tokenize.untokenize]tokenize.untokenize(iterable)`4243Преобразует токены обратно в исходный код Python. *Итерируемый объект* должен возвращать последовательности как минимум из двух элементов: типа токена и строки токена. Все дополнительные элементы последовательности игнорируются.4445Восстановленный скрипт возвращается в виде одной строки. Результат гарантированно токенизируется обратно в соответствии с входными данными, что обеспечивает преобразование без потерь и полную обратимость. Гарантия распространяется только на тип токена и строку токена, поскольку расстояния между токенами (позиции столбцов) могут измениться.4647Он возвращает байты, закодированные с использованием токена ENCODING, который является первой последовательностью токенов, выводимой [`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize).4849[`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize) необходимо определять кодировку исходных файлов, которые он токенизирует. Функция, которую он для этого использует, доступна:5051#### `[tokenize.detect_encoding]tokenize.detect_encoding(readline)`5253The [`detect_encoding()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.detect_encoding) function is used to detect the encoding that should be used to decode a Python source file. It requires one argment, readline, in the same way as the [`tokenize()`](https://python-all.ru/3.0/library/tokenize.html#tokenize.tokenize) generator.5455Она вызовет readline максимум дважды и вернёт используемую кодировку (в виде строки) и список любых строк (не декодированных из байтов), которые она прочитала .5657Она определяет кодировку по наличию метки BOM UTF-8 или cookie кодировки, как указано в PEP 0263. Если присутствуют и BOM, и cookie, но они не совпадают, будет возбуждено исключение SyntaxError.5859Если кодировка не указана, будет возвращена кодировка по умолчанию – 'utf-8'.6061Пример перезаписывателя скриптов, преобразующего литералы с плавающей запятой в объекты Decimal:6263```python64def decistmt(s):65    """Substitute Decimals for floats in a string of statements.6667    >>> from decimal import Decimal68    >>> s = 'print(+21.3e-5*-.1234/81.7)'69    >>> decistmt(s)70    "print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))"7172    The format of the exponent is inherited from the platform C library.73    Known cases are "e-007" (Windows) and "e-07" (not Windows).  Since74    we're only showing 12 digits, and the 13th isn't close to 5, the75    rest of the output should be platform-independent.7677    >>> exec(s) #doctest: +ELLIPSIS78    -3.21716034272e-0...77980    Output from calculations with Decimal should be identical across all81    platforms.8283    >>> exec(decistmt(s))84    -3.217160342717258261933904529E-785    """86    result = []87    g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string88    for toknum, tokval, _, _, _  in g:89        if toknum == NUMBER and '.' in tokval:  # replace NUMBER tokens90            result.extend([91                (NAME, 'Decimal'),92                (OP, '('),93                (STRING, repr(tokval)),94                (OP, ')')95            ])96        else:97            result.append((toknum, tokval))98    return untokenize(result).decode('utf-8')99```100