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

2to3.md

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

1> **Источник:** https://python-all.ru/3.0/library/2to3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 2to3 – автоматическое преобразование кода Python 2 в 3892to3 – это программа на Python, которая читает исходный код Python 2.x и применяет ряд *преобразователей* для преобразования его в корректный код Python 3.x. Стандартная библиотека содержит обширный набор преобразователей, которые справляются почти с любым кодом. Однако библиотека поддержки 2to3 `lib2to3` – это гибкая и универсальная библиотека, поэтому можно писать собственные преобразователи для 2to3. `lib2to3` также можно адаптировать для заказных приложений, в которых требуется автоматически редактировать код Python.1011## Использование 2to312132to3 обычно устанавливается вместе с интерпретатором Python как скрипт. Он также находится в каталоге `Tools/scripts` корневого каталога Python.1415Основные аргументы 2to3 – это список файлов или каталогов для преобразования. Каталоги обходятся рекурсивно в поисках исходников Python.1617Вот пример исходного файла Python 2.x, `example.py`:1819```python20def greet(name):21    print "Hello, {0}!".format(name)22print "What's your name?"23name = raw_input()24greet(name)25```2627Его можно преобразовать в код Python 3.x с помощью 2to3 в командной строке:2829```python30$ 2to3 example.py31```3233Выводится diff относительно исходного файла. 2to3 также может записывать необходимые изменения обратно в исходный файл. (Разумеется, создается резервная копия оригинала, если только не указан *-n*.) Запись изменений обратно включается флагом *-w*:3435```python36$ 2to3 -w example.py37```3839После преобразования `example.py` выглядит так:4041```python42def greet(name):43    print("Hello, {0}!".format(name))44print("What's your name?")45name = input()46greet(name)47```4849Комментарии и точные отступы сохраняются на протяжении всего процесса преобразования.5051По умолчанию 2to3 запускает набор предопределенных фиксеров. Флаг *-l* выводит список всех доступных фиксеров. Явный набор фиксеров для запуска можно задать с помощью *-f*. Аналогично, [*-x*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-x) явно отключает фиксер. В следующем примере запускаются только фиксеры `imports` и `has_key`:5253```python54$ 2to3 -f imports -f has_key example.py55```5657Эта команда запускает все фиксеры, кроме фиксера `apply`:5859```python60$ 2to3 -x apply example.py61```6263Некоторые фиксеры являются *явными*, то есть они не запускаются по умолчанию, и их необходимо указать в командной строке для запуска. Здесь, помимо фиксеров по умолчанию, запускается фиксер `idioms`:6465```python66$ 2to3 -f all -f idioms example.py67```6869Обратите внимание, что передача `all` включает все фиксеры по умолчанию.7071Иногда 2to3 находит в исходном коде место, которое нужно изменить, но не может исправить автоматически. В этом случае 2to3 выводит предупреждение под diff для файла. Следует обработать это предупреждение, чтобы получить корректный код 3.x.72732to3 также может рефакторить doctest'ы. Для включения этого режима используйте флаг [*-d*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-d). Обратите внимание, что *только* doctest'ы будут подвергнуты рефакторингу. При этом модуль не обязан быть корректным Python. Например, примеры в стиле doctest в reST-документе также можно рефакторить с помощью этой опции.7475Опция [*-v*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-v) включает вывод дополнительной информации о процессе перевода.7677Когда передается флаг *-p*, 2to3 обрабатывает `print` как функцию, а не как инструкцию. Это полезно, когда используется `from __future__ import print_function`. Если этот параметр не задан, фиксер print будет заключать вызовы print в дополнительные скобки, так как он не может различить между инструкцией print со скобками (например, `print ("a" + "b" + "c")`) и настоящим вызовом функции.7879## `lib2to3` – библиотека 2to38081> **Предупреждение**82>83> API `lib2to3` следует считать нестабильным и в будущем оно может кардинально измениться.84