2to3.md
1> **Источник:** https://python-all.ru/3.12/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`](https://python-all.ru/3.12/library/2to3.html#module-lib2to3), однако, представляет собой гибкую и универсальную библиотеку, поэтому можно писать собственные преобразователи для 2to3.1011Устарело с версии 3.11, будет удалено в версии 3.13: Модуль `lib2to3` был отмечен как намечаемый к устареванию в Python 3.9 (вызывает [`PendingDeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#PendingDeprecationWarning) при импорте) и полностью устарел в Python 3.11 (вызывает [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning)). Инструмент `2to3` является частью этого. Он будет удалён в Python 3.13.1213## Использование 2to314152to3 обычно устанавливается вместе с интерпретатором Python как скрипт. Он также находится в каталоге `Tools/scripts` корневой директории Python.1617Основные аргументы 2to3 – это список файлов или каталогов для преобразования. Каталоги обходятся рекурсивно в поисках исходников Python.1819Вот пример исходного файла на Python 2.x, `example.py`:2021```python22def greet(name):23 print "Hello, {0}!".format(name)24print "What's your name?"25name = raw_input()26greet(name)27```2829Его можно преобразовать в код Python 3.x с помощью 2to3 в командной строке:3031```console32$ 2to3 example.py33```3435Выводится diff относительно исходного файла. 2to3 также может записать необходимые изменения прямо в исходный файл. (Резервная копия исходного файла создаётся, если только не указан `-n`.) Запись изменений обратно включается флагом `-w`:3637```console38$ 2to3 -w example.py39```4041После преобразования `example.py` выглядит так:4243```python44def greet(name):45 print("Hello, {0}!".format(name))46print("What's your name?")47name = input()48greet(name)49```5051Комментарии и точные отступы сохраняются на протяжении всего процесса преобразования.5253По умолчанию 2to3 запускает набор [предопределённых преобразователей](https://python-all.ru/3.12/library/2to3.html#to3-fixers). Флаг `-l` выводит список всех доступных преобразователей. Явный набор преобразователей для запуска можно задать с помощью `-f`. Аналогично `-x` явно отключает преобразователь. В следующем примере запускаются только преобразователи `imports` и `has_key`:5455```console56$ 2to3 -f imports -f has_key example.py57```5859Эта команда запускает все преобразователи, кроме `apply`:6061```console62$ 2to3 -x apply example.py63```6465Некоторые преобразователи являются *явными*, то есть они не запускаются по умолчанию и должны быть перечислены в командной строке для запуска. Здесь, помимо преобразователей по умолчанию, запускается преобразователь `idioms`:6667```console68$ 2to3 -f all -f idioms example.py69```7071Обратите внимание: передача `all` включает все преобразователи по умолчанию.7273Иногда 2to3 находит в исходном коде место, которое нужно изменить, но не может исправить автоматически. В этом случае 2to3 выводит предупреждение под diff для файла. Следует обработать это предупреждение, чтобы получить корректный код 3.x.74752to3 также может рефакторить доктесты. Чтобы включить этот режим, используйте флаг `-d`. Обратите внимание, что рефакторингу подвергнутся *только* доктесты. Для этого также не требуется, чтобы модуль был корректным Python. Например, примеры, оформленные как доктесты в reST-документе, также могут быть отрефакторены с помощью этой опции.7677Опция `-v` включает вывод дополнительной информации о процессе преобразования.7879Поскольку некоторые операторы print могут быть разобраны как вызовы функций или инструкции, 2to3 не всегда может корректно читать файлы, содержащие функцию print. Когда 2to3 обнаруживает наличие директивы компилятора `from __future__ import print_function`, он изменяет свою внутреннюю грамматику, чтобы интерпретировать [`print()`](https://python-all.ru/3.12/library/functions.html#print) как функцию. Это изменение также можно включить вручную с помощью флага `-p`. Используйте `-p` для запуска преобразователей на коде, в котором операторы print уже были преобразованы. Также `-e` можно использовать, чтобы сделать [`exec()`](https://python-all.ru/3.12/library/functions.html#exec) функцией.8081Опция `-o` или `--output-dir` позволяет указать альтернативный каталог для записи выходных файлов. Флаг `-n` обязателен при использовании этого, поскольку резервные копии не имеют смысла, когда исходные файлы не перезаписываются.8283Добавлено в версии 3.2.3: Была добавлена опция `-o`.8485Флаг `-W` или `--write-unchanged-files` предписывает 2to3 всегда записывать выходные файлы, даже если файл не требовал изменений. Это наиболее полезно с `-o`, чтобы всё дерево исходников Python было скопировано с преобразованием из одного каталога в другой. Эта опция подразумевает флаг `-w`, иначе она не имела бы смысла.8687Добавлено в версии 3.2.3: Был добавлен флаг `-W`.8889Опция `--add-suffix` задаёт строку, которая будет добавлена ко всем именам выходных файлов. Флаг `-n` обязателен при указании этой опции, так как резервные копии не нужны при записи в файлы с другими именами. Пример:9091```console92$ 2to3 -n -W --add-suffix=3 example.py93```9495Приведёт к записи преобразованного файла с именем `example.py3`.9697Добавлено в версии 3.2.3: Была добавлена опция `--add-suffix`.9899Чтобы преобразовать весь проект из одного дерева каталогов в другое, используйте:100101```console102$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode103```104105## Преобразователи106107Каждый шаг преобразования кода инкапсулирован в преобразователе. Команда `2to3 -l` выводит их список. Как [описано выше](https://python-all.ru/3.12/library/2to3.html#to3-using), каждый можно включать и отключать по отдельности. Здесь они описаны более подробно.108109#### `apply`110111Удаляет использование `apply()`. Например, `apply(function, *args, **kwargs)` преобразуется в `function(*args, **kwargs)`.112113#### `asserts`114115Заменяет устаревшие имена методов [`unittest`](https://python-all.ru/3.12/library/unittest.html#module-unittest) на корректные.116117| Из | В |118| --- | --- |119| `failUnlessEqual(a, b)` | [`assertEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertEqual) |120| `assertEquals(a, b)` | [`assertEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertEqual) |121| `failIfEqual(a, b)` | [`assertNotEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertNotEqual) |122| `assertNotEquals(a, b)` | [`assertNotEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertNotEqual) |123| `failUnless(a)` | [`assertTrue(a)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertTrue) |124| `assert_(a)` | [`assertTrue(a)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertTrue) |125| `failIf(a)` | [`assertFalse(a)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertFalse) |126| `failUnlessRaises(exc, cal)` | [`assertRaises(exc, cal)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertRaises) |127| `failUnlessAlmostEqual(a, b)` | [`assertAlmostEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertAlmostEqual) |128| `assertAlmostEquals(a, b)` | [`assertAlmostEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertAlmostEqual) |129| `failIfAlmostEqual(a, b)` | [`assertNotAlmostEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |130| `assertNotAlmostEquals(a, b)` | [`assertNotAlmostEqual(a, b)`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |131132#### `basestring`133134Преобразует `basestring` в [`str`](https://python-all.ru/3.12/library/stdtypes.html#str).135136#### `buffer`137138Преобразует `buffer` в [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview). Этот фиксер необязателен, поскольку API [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview) похож, но не полностью совпадает с API `buffer`.139140#### `dict`141142Исправляет методы итерации словарей. `dict.iteritems()` преобразуется в [`dict.items()`](https://python-all.ru/3.12/library/stdtypes.html#dict.items), `dict.iterkeys()` – в [`dict.keys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.keys), а `dict.itervalues()` – в [`dict.values()`](https://python-all.ru/3.12/library/stdtypes.html#dict.values). Аналогично, `dict.viewitems()`, `dict.viewkeys()` и `dict.viewvalues()` преобразуются соответственно в [`dict.items()`](https://python-all.ru/3.12/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.12/library/stdtypes.html#dict.values). Также он оборачивает существующие использования [`dict.items()`](https://python-all.ru/3.12/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.12/library/stdtypes.html#dict.values) в вызов [`list`](https://python-all.ru/3.12/library/stdtypes.html#list).143144#### `except`145146Преобразует `except X, T` в `except X as T`.147148#### `exec`149150Преобразует оператор `exec` в функцию [`exec()`](https://python-all.ru/3.12/library/functions.html#exec).151152#### `execfile`153154Удаляет использование `execfile()`. Аргумент `execfile()` оборачивается в вызовы [`open()`](https://python-all.ru/3.12/library/functions.html#open), [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) и [`exec()`](https://python-all.ru/3.12/library/functions.html#exec).155156#### `exitfunc`157158Изменяет присваивание `sys.exitfunc` на использование модуля [`atexit`](https://python-all.ru/3.12/library/atexit.html#module-atexit).159160#### `filter`161162Оборачивает использование [`filter()`](https://python-all.ru/3.12/library/functions.html#filter) в вызов [`list`](https://python-all.ru/3.12/library/stdtypes.html#list).163164#### `funcattrs`165166Исправляет переименованные атрибуты функций. Например, `my_function.func_closure` преобразуется в `my_function.__closure__`.167168#### `future`169170Удаляет операторы `from __future__ import new_feature`.171172#### `getcwdu`173174Переименовывает `os.getcwdu()` в [`os.getcwd()`](https://python-all.ru/3.12/library/os.html#os.getcwd).175176#### `has_key`177178Изменяет `dict.has_key(key)` на `key in dict`.179180#### `idioms`181182Этот необязательный фиксер выполняет несколько преобразований, делающих код Python более идиоматичным. Сравнения типов, такие как `type(x) is SomeClass` и `type(x) == SomeClass`, преобразуются в `isinstance(x, SomeClass)`. `while 1` становится `while True`. Этот фиксер также старается использовать [`sorted()`](https://python-all.ru/3.12/library/functions.html#sorted) в подходящих местах. Например, этот блок183184```python185L = list(some_iterable)186L.sort()187```188189изменяется на190191```python192L = sorted(some_iterable)193```194195#### `import`196197Обнаруживает импорты соседних модулей и преобразует их в относительные импорты.198199#### `imports`200201Обрабатывает переименования модулей в стандартной библиотеке.202203#### `imports2`204205Обрабатывает переименования других модулей в стандартной библиотеке. Он отделён от фиксера [`imports`](https://python-all.ru/3.12/library/2to3.html#to3fixer-imports) только из-за технических ограничений.206207#### `input`208209Преобразует `input(prompt)` в `eval(input(prompt))`.210211#### `intern`212213Преобразует `intern()` в [`sys.intern()`](https://python-all.ru/3.12/library/sys.html#sys.intern).214215#### `isinstance`216217Исправляет дублирование типов во втором аргументе [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance). Например, `isinstance(x, (int, int))` преобразуется в `isinstance(x, int)`, а `isinstance(x, (int, float, int))` преобразуется в `isinstance(x, (int, float))`.218219#### `itertools_imports`220221Удаляет импорты `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()`. Импорты `itertools.ifilterfalse()` также заменяются на [`itertools.filterfalse()`](https://python-all.ru/3.12/library/itertools.html#itertools.filterfalse).222223#### `itertools`224225Изменяет использование `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()` на их встроенные аналоги. `itertools.ifilterfalse()` заменяется на [`itertools.filterfalse()`](https://python-all.ru/3.12/library/itertools.html#itertools.filterfalse).226227#### `long`228229Переименовывает `long` в [`int`](https://python-all.ru/3.12/library/functions.html#int).230231#### `map`232233Оборачивает [`map()`](https://python-all.ru/3.12/library/functions.html#map) в вызов [`list`](https://python-all.ru/3.12/library/stdtypes.html#list). Также заменяет `map(None, x)` на `list(x)`. Использование `from future_builtins import map` отключает этот фиксер.234235#### `metaclass`236237Преобразует старый синтаксис метакласса (`__metaclass__ = Meta` в теле класса) в новый (`class X(metaclass=Meta)`).238239#### `methodattrs`240241Исправляет старые имена атрибутов методов. Например, `meth.im_func` преобразуется в `meth.__func__`.242243#### `ne`244245Преобразует старый синтаксис неравенства, `<>`, в `!=`.246247#### `next`248249Преобразует использование методов `next()` итератора в функцию [`next()`](https://python-all.ru/3.12/library/functions.html#next). Также переименовывает методы [`next()`](https://python-all.ru/3.12/library/functions.html#next) в [`__next__()`](https://python-all.ru/3.12/library/stdtypes.html#iterator.__next__).250251#### `nonzero`252253Переименовывает определения методов с именем `__nonzero__()` в [`__bool__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__bool__).254255#### `numliterals`256257Преобразует восьмеричные литералы в новый синтаксис.258259#### `operator`260261Преобразует вызовы различных функций из модуля [`operator`](https://python-all.ru/3.12/library/operator.html#module-operator) в другие, но эквивалентные вызовы. При необходимости добавляются соответствующие операторы `import`, например `import collections.abc`. Выполняется следующее отображение:262263| Из | В |264| --- | --- |265| `operator.isCallable(obj)` | `callable(obj)` |266| `operator.sequenceIncludes(obj)` | `operator.contains(obj)` |267| `operator.isSequenceType(obj)` | `isinstance(obj, collections.abc.Sequence)` |268| `operator.isMappingType(obj)` | `isinstance(obj, collections.abc.Mapping)` |269| `operator.isNumberType(obj)` | `isinstance(obj, numbers.Number)` |270| `operator.repeat(obj, n)` | `operator.mul(obj, n)` |271| `operator.irepeat(obj, n)` | `operator.imul(obj, n)` |272273#### `paren`274275Добавляет дополнительные круглые скобки там, где они необходимы в списковых включениях. Например, `[x for x in 1, 2]` становится `[x for x in (1, 2)]`.276277#### `print`278279Преобразует инструкцию `print` в функцию [`print()`](https://python-all.ru/3.12/library/functions.html#print).280281#### `raise`282283Преобразует `raise E, V` в `raise E(V)` и `raise E, V, T` в `raise E(V).with_traceback(T)`. Если `E` является кортежем, перевод будет некорректным, поскольку замена кортежами исключений была удалена в версии 3.0.284285#### `raw_input`286287Преобразует `raw_input()` в [`input()`](https://python-all.ru/3.12/library/functions.html#input).288289#### `reduce`290291Обрабатывает перемещение `reduce()` в [`functools.reduce()`](https://python-all.ru/3.12/library/functools.html#functools.reduce).292293#### `reload`294295Преобразует `reload()` в [`importlib.reload()`](https://python-all.ru/3.12/library/importlib.html#importlib.reload).296297#### `renames`298299Изменяет `sys.maxint` на [`sys.maxsize`](https://python-all.ru/3.12/library/sys.html#sys.maxsize).300301#### `repr`302303Заменяет repr с обратными кавычками на функцию [`repr()`](https://python-all.ru/3.12/library/functions.html#repr).304305#### `set_literal`306307Заменяет использование конструктора [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) на литералы множества. Этот фиксер является необязательным.308309#### `standarderror`310311Переименовывает `StandardError` в [`Exception`](https://python-all.ru/3.12/library/exceptions.html#Exception).312313#### `sys_exc`314315Изменяет устаревшие `sys.exc_value`, `sys.exc_type`, `sys.exc_traceback` на использование [`sys.exc_info()`](https://python-all.ru/3.12/library/sys.html#sys.exc_info).316317#### `throw`318319Исправляет изменение API в методе `throw()` генератора.320321#### `tuple_params`322323Удаляет неявную распаковку параметров кортежа. Этот фиксер вставляет временные переменные.324325#### `types`326327Исправляет код, сломанный в результате удаления некоторых членов модуля [`types`](https://python-all.ru/3.12/library/types.html#module-types).328329#### `unicode`330331Переименовывает `unicode` в [`str`](https://python-all.ru/3.12/library/stdtypes.html#str).332333#### `urllib`334335Обрабатывает переименование [`urllib`](https://python-all.ru/3.12/library/urllib.html#module-urllib) и `urllib2` в пакет [`urllib`](https://python-all.ru/3.12/library/urllib.html#module-urllib).336337#### `ws_comma`338339Удаляет лишние пробелы из элементов, разделённых запятыми. Этот фиксер необязателен.340341#### `xrange`342343Переименовывает `xrange()` в [`range()`](https://python-all.ru/3.12/library/stdtypes.html#range) и оборачивает существующие вызовы [`range()`](https://python-all.ru/3.12/library/stdtypes.html#range) в [`list`](https://python-all.ru/3.12/library/stdtypes.html#list).344345#### `xreadlines`346347Заменяет `for x in file.xreadlines()` на `for x in file`.348349#### `zip`350351Оборачивает использование [`zip()`](https://python-all.ru/3.12/library/functions.html#zip) в вызов [`list`](https://python-all.ru/3.12/library/stdtypes.html#list). Отключается, когда появляется `from future_builtins import zip`.352353## [`lib2to3`](https://python-all.ru/3.12/library/2to3.html#module-lib2to3) – библиотека 2to3354355**Исходный код:** [Lib/lib2to3/](https://python-all.ru/src/3.12/Lib/lib2to3)356357---358359Устарело с версии 3.11, будет удалено в версии 3.13: В Python 3.9 перешли на PEG-парсер (см. [**PEP 617**](https://python-all.ru/3.12/library/2to3.html)), в то время как lib2to3 использует менее гибкий LL(1)-парсер. Python 3.10 содержит новый синтаксис языка, который не может быть разобран LL(1)-парсером lib2to3 (см. [**PEP 634**](https://python-all.ru/3.12/library/2to3.html)). Модуль `lib2to3` был помечен как ожидающий устаревания в Python 3.9 (при импорте вызывал [`PendingDeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#PendingDeprecationWarning)) и полностью устарел в Python 3.11 (вызывает [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning)). Он будет удалён из стандартной библиотеки в Python 3.13. Рассмотрите сторонние альтернативы, такие как [LibCST](https://python-all.ru/3.12/library/2to3.html) или [parso](https://python-all.ru/3.12/library/2to3.html).360361> **Примечание**362>363> API [`lib2to3`](https://python-all.ru/3.12/library/2to3.html#module-lib2to3) следует считать нестабильным; в будущем оно может кардинально измениться.364