2to3.md
1> **Источник:** https://python-all.ru/3.4/library/2to3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 26.6. 2to3 – автоматический перевод кода с Python 2 на Python 3892to3 – это программа на Python, которая читает исходный код Python 2.x и применяет ряд *фиксеров*, чтобы преобразовать его в корректный код Python 3.x. Стандартная библиотека содержит богатый набор фиксеров, которые обрабатывают почти любой код. Однако вспомогательная библиотека [`lib2to3`](https://python-all.ru/3.4/library/2to3.html#module-lib2to3) является гибкой и универсальной, поэтому можно написать собственные фиксеры для 2to3. [`lib2to3`](https://python-all.ru/3.4/library/2to3.html#module-lib2to3) также можно адаптировать для пользовательских приложений, где требуется автоматическое редактирование кода Python.1011## 26.6.1. Использование 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 запускает набор [*предопределённых фиксеров*](https://python-all.ru/3.4/library/2to3.html#to3-fixers). Флаг [*-l*](https://python-all.ru/3.4/library/tarfile.html#cmdoption-l) выводит список всех доступных фиксеров. Явный набор фиксеров для запуска можно задать с помощью *-f*. Аналогично, [*-x*](https://python-all.ru/3.4/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.4/using/cmdline.html#cmdoption-d). Обратите внимание, что *только* doctest'ы будут подвергнуты рефакторингу. При этом модуль не обязан быть корректным Python. Например, примеры в стиле doctest в reST-документе также можно рефакторить с помощью этой опции.7475Опция [*-v*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-v) включает вывод дополнительной информации о процессе перевода.7677Поскольку некоторые операторы print можно разобрать как вызовы функций или как инструкции, 2to3 не всегда может читать файлы, содержащие функцию print. Когда 2to3 обнаруживает указание компилятора `from __future__ import print_function`, он изменяет свою внутреннюю грамматику, чтобы интерпретировать [`print()`](https://python-all.ru/3.4/library/functions.html#print) как функцию. Это изменение также можно включить вручную с помощью флага *-p*. Используйте *-p* для запуска фиксеров на коде, в котором операторы print уже преобразованы.7879Опция *-o* или *--output-dir* позволяет указать альтернативный каталог для записи обработанных выходных файлов. Флаг *-n* обязателен при использовании этой опции, так как резервные копии не имеют смысла, если исходные файлы не перезаписываются.8081Новое в версии 3.2.3: Добавлена опция *-o*.8283Флаг [*-W*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-W) или *--write-unchanged-files* указывает 2to3 всегда записывать выходные файлы, даже если в файл не требовалось вносить изменения. Это наиболее полезно в сочетании с *-o*, чтобы скопировать всё дерево исходного кода Python с переводом из одного каталога в другой. Эта опция подразумевает флаг *-w*, поскольку иначе она не имела бы смысла.8485Новое в версии 3.2.3: Добавлен флаг [*-W*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-W).8687Опция *--add-suffix* задаёт строку, которая будет добавлена ко всем именам выходных файлов. Флаг *-n* обязателен при указании этой опции, так как резервные копии не нужны, если запись ведётся в файлы с другими именами. Пример:8889```python90$ 2to3 -n -W --add-suffix=3 example.py91```9293В результате будет записан преобразованный файл с именем `example.py3`.9495Новое в версии 3.2.3: Добавлена опция *--add-suffix*.9697Чтобы преобразовать весь проект из одного дерева каталогов в другое, используйте:9899```python100$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode101```102103## 26.6.2. Фиксеры104105Каждый шаг преобразования кода инкапсулирован в фиксере. Команда `2to3 -l` выводит их список. Как уже [*описано выше*](https://python-all.ru/3.4/library/2to3.html#to3-using), каждый можно включить или отключить по отдельности. Ниже они описаны подробнее.106107**`apply`**108109Удаляет использование `apply()`. Например, `apply(function, *args, **kwargs)` преобразуется в `function(*args, **kwargs)`.110111**`asserts`**112113Заменяет устаревшие имена методов [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) на корректные.114115| Из | В |116| --- | --- |117| `failUnlessEqual(a, b)` | [`assertEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertEqual) |118| `assertEquals(a, b)` | [`assertEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertEqual) |119| `failIfEqual(a, b)` | [`assertNotEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotEqual) |120| `assertNotEquals(a, b)` | [`assertNotEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotEqual) |121| `failUnless(a)` | [`assertTrue(a)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertTrue) |122| `assert_(a)` | [`assertTrue(a)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertTrue) |123| `failIf(a)` | [`assertFalse(a)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertFalse) |124| `failUnlessRaises(exc, cal)` | [`assertRaises(exc, cal)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertRaises) |125| `failUnlessAlmostEqual(a, b)` | [`assertAlmostEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertAlmostEqual) |126| `assertAlmostEquals(a, b)` | [`assertAlmostEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertAlmostEqual) |127| `failIfAlmostEqual(a, b)` | [`assertNotAlmostEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |128| `assertNotAlmostEquals(a, b)` | [`assertNotAlmostEqual(a, b)`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |129130**`basestring`**131132Преобразует `basestring` в [`str`](https://python-all.ru/3.4/library/stdtypes.html#str).133134**`buffer`**135136Преобразует `buffer` в [`memoryview`](https://python-all.ru/3.4/library/stdtypes.html#memoryview). Этот фиксер необязателен, поскольку API [`memoryview`](https://python-all.ru/3.4/library/stdtypes.html#memoryview) похож, но не полностью совпадает с API `buffer`.137138**`callable`**139140Преобразует `callable(x)` в `isinstance(x, collections.Callable)`, добавляя импорт [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) при необходимости. Обратите внимание, что `callable(x)` была возвращена в Python 3.2, поэтому если не планируется поддержка Python 3.1, этот фиксер можно отключить.141142**`dict`**143144Исправляет методы итерации словарей. `dict.iteritems()` преобразуется в [`dict.items()`](https://python-all.ru/3.4/library/stdtypes.html#dict.items), `dict.iterkeys()` в [`dict.keys()`](https://python-all.ru/3.4/library/stdtypes.html#dict.keys), а `dict.itervalues()` в [`dict.values()`](https://python-all.ru/3.4/library/stdtypes.html#dict.values). Аналогично, `dict.viewitems()`, `dict.viewkeys()` и `dict.viewvalues()` преобразуются соответственно в [`dict.items()`](https://python-all.ru/3.4/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.4/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.4/library/stdtypes.html#dict.values). Кроме того, он оборачивает существующие использования [`dict.items()`](https://python-all.ru/3.4/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.4/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.4/library/stdtypes.html#dict.values) в вызов [`list`](https://python-all.ru/3.4/library/stdtypes.html#list).145146**`except`**147148Преобразует `except X, T` в `except X as T`.149150**`exec`**151152Преобразует инструкцию `exec` в функцию [`exec()`](https://python-all.ru/3.4/library/functions.html#exec).153154**`execfile`**155156Удаляет использование `execfile()`. Аргумент `execfile()` оборачивается вызовами [`open()`](https://python-all.ru/3.4/library/functions.html#open), [`compile()`](https://python-all.ru/3.4/library/functions.html#compile) и [`exec()`](https://python-all.ru/3.4/library/functions.html#exec).157158**`exitfunc`**159160Заменяет присваивание `sys.exitfunc` на использование модуля [`atexit`](https://python-all.ru/3.4/library/atexit.html#module-atexit).161162**`filter`**163164Оборачивает использование [`filter()`](https://python-all.ru/3.4/library/functions.html#filter) в вызов [`list`](https://python-all.ru/3.4/library/stdtypes.html#list).165166**`funcattrs`**167168Исправляет атрибуты функций, которые были переименованы. Например, `my_function.func_closure` преобразуется в `my_function.__closure__`.169170**`future`**171172Удаляет операторы `from __future__ import new_feature`.173174**`getcwdu`**175176Переименовывает `os.getcwdu()` в [`os.getcwd()`](https://python-all.ru/3.4/library/os.html#os.getcwd).177178**`has_key`**179180Заменяет `dict.has_key(key)` на `key in dict`.181182**`idioms`**183184Этот дополнительный фиксер выполняет несколько преобразований, делающих код Python более идиоматичным. Сравнения типов, такие как `type(x) is SomeClass` и `type(x) == SomeClass`, преобразуются в `isinstance(x, SomeClass)`. `while 1` становится `while True`. Этот фиксер также старается использовать [`sorted()`](https://python-all.ru/3.4/library/functions.html#sorted) в подходящих местах. Например, этот блок185186```python187L = list(some_iterable)188L.sort()189```190191изменяется на192193```python194L = sorted(some_iterable)195```196197**`import`**198199Обнаруживает импорты соседних модулей и преобразует их в относительные импорты.200201**`imports`**202203Обрабатывает переименования модулей в стандартной библиотеке.204205**`imports2`**206207Обрабатывает переименования других модулей в стандартной библиотеке. Он отделён от фиксера [`imports`](https://python-all.ru/3.4/library/2to3.html#2to3fixer-imports) только из-за технических ограничений.208209**`input`**210211Преобразует `input(prompt)` в `eval(input(prompt))`.212213**`intern`**214215Преобразует `intern()` в [`sys.intern()`](https://python-all.ru/3.4/library/sys.html#sys.intern).216217**`isinstance`**218219Исправляет дублирующиеся типы во втором аргументе [`isinstance()`](https://python-all.ru/3.4/library/functions.html#isinstance). Например, `isinstance(x, (int, int))` преобразуется в `isinstance(x, (int))`.220221**`itertools_imports`**222223Удаляет импорты `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()`. Импорты `itertools.ifilterfalse()` также заменяются на [`itertools.filterfalse()`](https://python-all.ru/3.4/library/itertools.html#itertools.filterfalse).224225**`itertools`**226227Заменяет использование `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()` на их встроенные эквиваленты. `itertools.ifilterfalse()` заменяется на [`itertools.filterfalse()`](https://python-all.ru/3.4/library/itertools.html#itertools.filterfalse).228229**`long`**230231Переименовывает `long` в [`int`](https://python-all.ru/3.4/library/functions.html#int).232233**`map`**234235Оборачивает [`map()`](https://python-all.ru/3.4/library/functions.html#map) в вызов [`list`](https://python-all.ru/3.4/library/stdtypes.html#list). Также заменяет `map(None, x)` на `list(x)`. Использование `from future_builtins import map` отключает этот фиксер.236237**`metaclass`**238239Преобразует старый синтаксис метакласса (`__metaclass__ = Meta` в теле класса) в новый (`class X(metaclass=Meta)`).240241**`methodattrs`**242243Исправляет старые имена атрибутов методов. Например, `meth.im_func` преобразуется в `meth.__func__`.244245**`ne`**246247Преобразует старый синтаксис неравенства, `<>`, в `!=`.248249**`next`**250251Преобразует использование методов `next()` итератора в функцию [`next()`](https://python-all.ru/3.4/library/functions.html#next). Также переименовывает методы [`next()`](https://python-all.ru/3.4/library/functions.html#next) в [`__next__()`](https://python-all.ru/3.4/library/stdtypes.html#iterator.__next__).252253**`nonzero`**254255Переименовывает `__nonzero__()` в [`__bool__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__bool__).256257**`numliterals`**258259Преобразует восьмеричные литералы в новый синтаксис.260261**`operator`**262263Преобразует вызовы различных функций из модуля [`operator`](https://python-all.ru/3.4/library/operator.html#module-operator) в другие, но эквивалентные вызовы функций. При необходимости добавляются соответствующие операторы `import`, например `import collections`. Выполняются следующие преобразования:264265| Из | В |266| --- | --- |267| `operator.isCallable(obj)` | `hasattr(obj, '__call__')` |268| `operator.sequenceIncludes(obj)` | `operator.contains(obj)` |269| `operator.isSequenceType(obj)` | `isinstance(obj, collections.Sequence)` |270| `operator.isMappingType(obj)` | `isinstance(obj, collections.Mapping)` |271| `operator.isNumberType(obj)` | `isinstance(obj, numbers.Number)` |272| `operator.repeat(obj, n)` | `operator.mul(obj, n)` |273| `operator.irepeat(obj, n)` | `operator.imul(obj, n)` |274275**`paren`**276277Добавляет дополнительные круглые скобки там, где они требуются в списковых включениях. Например, `[x for x in 1, 2]` становится `[x for x in (1, 2)]`.278279**`print`**280281Преобразует инструкцию `print` в функцию [`print()`](https://python-all.ru/3.4/library/functions.html#print).282283**`raise`**284285Преобразует `raise E, V` в `raise E(V)`, а `raise E, V, T` в `raise E(V).with_traceback(T)`. Если `E` – кортеж, преобразование будет некорректным, так как подстановка кортежей вместо исключений была удалена в версии 3.0.286287**`raw_input`**288289Преобразует `raw_input()` в [`input()`](https://python-all.ru/3.4/library/functions.html#input).290291**`reduce`**292293Обрабатывает перенос `reduce()` в [`functools.reduce()`](https://python-all.ru/3.4/library/functools.html#functools.reduce).294295**`reload`**296297Преобразует `reload()` в [`imp.reload()`](https://python-all.ru/3.4/library/imp.html#imp.reload).298299**`renames`**300301Изменяет `sys.maxint` на [`sys.maxsize`](https://python-all.ru/3.4/library/sys.html#sys.maxsize).302303**`repr`**304305Заменяет обратные кавычки на функцию [`repr()`](https://python-all.ru/3.4/library/functions.html#repr).306307**`set_literal`**308309Заменяет использование конструктора [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) на литералы множеств. Этот фиксер является необязательным.310311**`standarderror`**312313Переименовывает `StandardError` в [`Exception`](https://python-all.ru/3.4/library/exceptions.html#Exception).314315**`sys_exc`**316317Изменяет устаревшие `sys.exc_value`, `sys.exc_type`, `sys.exc_traceback` на использование [`sys.exc_info()`](https://python-all.ru/3.4/library/sys.html#sys.exc_info).318319**`throw`**320321Исправляет изменение API в методе `throw()` генератора.322323**`tuple_params`**324325Удаляет неявную распаковку параметров кортежа. Этот фиксер вставляет временные переменные.326327**`types`**328329Исправляет код, сломанный удалением некоторых членов модуля [`types`](https://python-all.ru/3.4/library/types.html#module-types).330331**`unicode`**332333Переименовывает `unicode` в [`str`](https://python-all.ru/3.4/library/stdtypes.html#str).334335**`urllib`**336337Обрабатывает переименование [`urllib`](https://python-all.ru/3.4/library/urllib.html#module-urllib) и `urllib2` в пакет [`urllib`](https://python-all.ru/3.4/library/urllib.html#module-urllib).338339**`ws_comma`**340341Удаляет лишние пробелы из элементов, разделённых запятыми. Этот фиксер необязателен.342343**`xrange`**344345Переименовывает `xrange()` в [`range()`](https://python-all.ru/3.4/library/stdtypes.html#range) и оборачивает существующие вызовы [`range()`](https://python-all.ru/3.4/library/stdtypes.html#range) в [`list`](https://python-all.ru/3.4/library/stdtypes.html#list).346347**`xreadlines`**348349Изменяет `for x in file.xreadlines()` на `for x in file`.350351**`zip`**352353Оборачивает использование [`zip()`](https://python-all.ru/3.4/library/functions.html#zip) в вызов [`list`](https://python-all.ru/3.4/library/stdtypes.html#list). Это отключается, когда встречается `from future_builtins import zip`.354355## 26.6.3. [`lib2to3`](https://python-all.ru/3.4/library/2to3.html#module-lib2to3) – библиотека 2to3356357> **Примечание**358>359> API [`lib2to3`](https://python-all.ru/3.4/library/2to3.html#module-lib2to3) следует считать нестабильным и может существенно измениться в будущем.360