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

---

# 2to3 – автоматическое преобразование кода Python 2 в 3

2to3 – это программа на Python, которая читает исходный код Python 2.x и применяет ряд *преобразователей* для преобразования его в корректный код Python 3.x. Стандартная библиотека содержит обширный набор преобразователей, которые справляются почти с любым кодом. Однако библиотека поддержки 2to3 `lib2to3` – это гибкая и универсальная библиотека, поэтому можно писать собственные преобразователи для 2to3. `lib2to3` также можно адаптировать для заказных приложений, в которых требуется автоматически редактировать код Python.

## Использование 2to3

2to3 обычно устанавливается вместе с интерпретатором Python как скрипт. Он также находится в каталоге `Tools/scripts` корневого каталога Python.

Основные аргументы 2to3 – это список файлов или каталогов для преобразования. Каталоги обходятся рекурсивно в поисках исходников Python.

Вот пример исходного файла Python 2.x, `example.py`:

```python
def greet(name):
    print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)
```

Его можно преобразовать в код Python 3.x с помощью 2to3 в командной строке:

```python
$ 2to3 example.py
```

Выводится diff относительно исходного файла. 2to3 также может записывать необходимые изменения обратно в исходный файл. (Разумеется, создается резервная копия оригинала, если только не указан *-n*.) Запись изменений обратно включается флагом *-w*:

```python
$ 2to3 -w example.py
```

После преобразования `example.py` выглядит так:

```python
def greet(name):
    print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)
```

Комментарии и точные отступы сохраняются на протяжении всего процесса преобразования.

По умолчанию 2to3 запускает набор предопределенных фиксеров. Флаг *-l* выводит список всех доступных фиксеров. Явный набор фиксеров для запуска можно задать с помощью *-f*. Аналогично, [*-x*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-x) явно отключает фиксер. В следующем примере запускаются только фиксеры `imports` и `has_key`:

```python
$ 2to3 -f imports -f has_key example.py
```

Эта команда запускает все фиксеры, кроме фиксера `apply`:

```python
$ 2to3 -x apply example.py
```

Некоторые фиксеры являются *явными*, то есть они не запускаются по умолчанию, и их необходимо указать в командной строке для запуска. Здесь, помимо фиксеров по умолчанию, запускается фиксер `idioms`:

```python
$ 2to3 -f all -f idioms example.py
```

Обратите внимание, что передача `all` включает все фиксеры по умолчанию.

Иногда 2to3 находит в исходном коде место, которое нужно изменить, но не может исправить автоматически. В этом случае 2to3 выводит предупреждение под diff для файла. Следует обработать это предупреждение, чтобы получить корректный код 3.x.

2to3 также может рефакторить doctest'ы. Для включения этого режима используйте флаг [*-d*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-d). Обратите внимание, что *только* doctest'ы будут подвергнуты рефакторингу. При этом модуль не обязан быть корректным Python. Например, примеры в стиле doctest в reST-документе также можно рефакторить с помощью этой опции.

Опция [*-v*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-v) включает вывод дополнительной информации о процессе перевода.

Когда передается флаг *-p*, 2to3 обрабатывает `print` как функцию, а не как инструкцию. Это полезно, когда используется `from __future__ import print_function`. Если этот параметр не задан, фиксер print будет заключать вызовы print в дополнительные скобки, так как он не может различить между инструкцией print со скобками (например, `print ("a" + "b" + "c")`) и настоящим вызовом функции.

## `lib2to3` – библиотека 2to3

> **Предупреждение**
>
> API `lib2to3` следует считать нестабильным и в будущем оно может кардинально измениться.
