2to3.md
1> **Источник:** https://python-all.ru/3.3/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.3/library/2to3.html#module-lib2to3) является гибкой и универсальной, поэтому можно написать собственные фиксеры для 2to3. [`lib2to3`](https://python-all.ru/3.3/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.3/library/2to3.html#to3-fixers). Флаг *-l* выводит список всех доступных преобразователей. Явный набор запускаемых преобразователей можно задать с помощью *-f*. Аналогично [*-x*](https://python-all.ru/3.3/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.3/using/cmdline.html#cmdoption-d). Обратите внимание, что *только* doctest'ы будут подвергнуты рефакторингу. При этом модуль не обязан быть корректным Python. Например, примеры в стиле doctest в reST-документе также можно рефакторить с помощью этой опции.7475Опция [*-v*](https://python-all.ru/3.3/using/cmdline.html#cmdoption-v) включает вывод дополнительной информации о процессе перевода.7677Поскольку некоторые операторы print можно разобрать как вызовы функций или как инструкции, 2to3 не всегда может читать файлы, содержащие функцию print. Когда 2to3 обнаруживает указание компилятора `from __future__ import print_function`, он изменяет свою внутреннюю грамматику, чтобы интерпретировать [`print()`](https://python-all.ru/3.3/library/functions.html#print) как функцию. Это изменение также можно включить вручную с помощью флага *-p*. Используйте *-p* для запуска фиксеров на коде, в котором операторы print уже преобразованы.7879Опция *-o* или *--output-dir* позволяет указать альтернативный каталог для записи обработанных выходных файлов. Флаг *-n* обязателен при использовании этой опции, так как резервные копии не имеют смысла, если исходные файлы не перезаписываются.8081Новое в версии 3.2.3: Добавлена опция *-o*.8283Флаг [*-W*](https://python-all.ru/3.3/using/cmdline.html#cmdoption-W) или *--write-unchanged-files* указывает 2to3 всегда записывать выходные файлы, даже если в файл не требовалось вносить изменения. Это наиболее полезно в сочетании с *-o*, чтобы скопировать всё дерево исходного кода Python с переводом из одного каталога в другой. Эта опция подразумевает флаг *-w*, поскольку иначе она не имела бы смысла.8485Новое в версии 3.2.3: Добавлен флаг [*-W*](https://python-all.ru/3.3/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.3/library/2to3.html#to3-using), каждый можно включить или отключить по отдельности. Ниже они описаны подробнее.106107**`apply`**108109Удаляет использование `apply()`. Например, `apply(function, *args, **kwargs)` преобразуется в `function(*args, **kwargs)`.110111**`basestring`**112113Преобразует `basestring` в [`str`](https://python-all.ru/3.3/library/stdtypes.html#str).114115**`buffer`**116117Преобразует `buffer` в [`memoryview`](https://python-all.ru/3.3/library/stdtypes.html#memoryview). Этот фиксер необязателен, поскольку API [`memoryview`](https://python-all.ru/3.3/library/stdtypes.html#memoryview) похож, но не полностью совпадает с API `buffer`.118119**`callable`**120121Преобразует `callable(x)` в `isinstance(x, collections.Callable)`, добавляя импорт [`collections`](https://python-all.ru/3.3/library/collections.html#module-collections) при необходимости. Обратите внимание, что `callable(x)` была возвращена в Python 3.2, поэтому если не планируется поддержка Python 3.1, этот фиксер можно отключить.122123**`dict`**124125Исправляет методы итерации словарей. `dict.iteritems()` преобразуется в [`dict.items()`](https://python-all.ru/3.3/library/stdtypes.html#dict.items), `dict.iterkeys()` в [`dict.keys()`](https://python-all.ru/3.3/library/stdtypes.html#dict.keys), а `dict.itervalues()` в [`dict.values()`](https://python-all.ru/3.3/library/stdtypes.html#dict.values). Аналогично, `dict.viewitems()`, `dict.viewkeys()` и `dict.viewvalues()` преобразуются соответственно в [`dict.items()`](https://python-all.ru/3.3/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.3/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.3/library/stdtypes.html#dict.values). Кроме того, он оборачивает существующие использования [`dict.items()`](https://python-all.ru/3.3/library/stdtypes.html#dict.items), [`dict.keys()`](https://python-all.ru/3.3/library/stdtypes.html#dict.keys) и [`dict.values()`](https://python-all.ru/3.3/library/stdtypes.html#dict.values) в вызов [`list`](https://python-all.ru/3.3/library/stdtypes.html#list).126127**`except`**128129Преобразует `except X, T` в `except X as T`.130131**`exec`**132133Преобразует инструкцию `exec` в функцию [`exec()`](https://python-all.ru/3.3/library/functions.html#exec).134135**`execfile`**136137Удаляет использование `execfile()`. Аргумент `execfile()` оборачивается вызовами [`open()`](https://python-all.ru/3.3/library/functions.html#open), [`compile()`](https://python-all.ru/3.3/library/functions.html#compile) и [`exec()`](https://python-all.ru/3.3/library/functions.html#exec).138139**`exitfunc`**140141Заменяет присваивание `sys.exitfunc` на использование модуля [`atexit`](https://python-all.ru/3.3/library/atexit.html#module-atexit).142143**`filter`**144145Оборачивает использование [`filter()`](https://python-all.ru/3.3/library/functions.html#filter) в вызов [`list`](https://python-all.ru/3.3/library/stdtypes.html#list).146147**`funcattrs`**148149Исправляет атрибуты функций, которые были переименованы. Например, `my_function.func_closure` преобразуется в `my_function.__closure__`.150151**`future`**152153Удаляет операторы `from __future__ import new_feature`.154155**`getcwdu`**156157Переименовывает `os.getcwdu()` в [`os.getcwd()`](https://python-all.ru/3.3/library/os.html#os.getcwd).158159**`has_key`**160161Заменяет `dict.has_key(key)` на `key in dict`.162163**`idioms`**164165Этот дополнительный фиксер выполняет несколько преобразований, делающих код Python более идиоматичным. Сравнения типов, такие как `type(x) is SomeClass` и `type(x) == SomeClass`, преобразуются в `isinstance(x, SomeClass)`. `while 1` становится `while True`. Этот фиксер также старается использовать [`sorted()`](https://python-all.ru/3.3/library/functions.html#sorted) в подходящих местах. Например, этот блок166167```python168L = list(some_iterable)169L.sort()170```171172изменяется на173174```python175L = sorted(some_iterable)176```177178**`import`**179180Обнаруживает импорты соседних модулей и преобразует их в относительные импорты.181182**`imports`**183184Обрабатывает переименования модулей в стандартной библиотеке.185186**`imports2`**187188Обрабатывает переименования других модулей в стандартной библиотеке. Он отделён от фиксера [`imports`](https://python-all.ru/3.3/library/2to3.html#2to3fixer-imports) только из-за технических ограничений.189190**`input`**191192Преобразует `input(prompt)` в `eval(input(prompt))`193194**`intern`**195196Преобразует `intern()` в [`sys.intern()`](https://python-all.ru/3.3/library/sys.html#sys.intern).197198**`isinstance`**199200Исправляет дублирующиеся типы во втором аргументе [`isinstance()`](https://python-all.ru/3.3/library/functions.html#isinstance). Например, `isinstance(x, (int, int))` преобразуется в `isinstance(x, (int))`.201202**`itertools_imports`**203204Удаляет импорты `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()`. Импорты `itertools.ifilterfalse()` также заменяются на [`itertools.filterfalse()`](https://python-all.ru/3.3/library/itertools.html#itertools.filterfalse).205206**`itertools`**207208Заменяет использование `itertools.ifilter()`, `itertools.izip()` и `itertools.imap()` на их встроенные эквиваленты. `itertools.ifilterfalse()` заменяется на [`itertools.filterfalse()`](https://python-all.ru/3.3/library/itertools.html#itertools.filterfalse).209210**`long`**211212Переименовывает `long` в [`int`](https://python-all.ru/3.3/library/functions.html#int).213214**`map`**215216Оборачивает [`map()`](https://python-all.ru/3.3/library/functions.html#map) в вызов [`list`](https://python-all.ru/3.3/library/stdtypes.html#list). Также заменяет `map(None, x)` на `list(x)`. Использование `from future_builtins import map` отключает этот фиксер.217218**`metaclass`**219220Преобразует старый синтаксис метакласса (`__metaclass__ = Meta` в теле класса) в новый (`class X(metaclass=Meta)`).221222**`methodattrs`**223224Исправляет старые имена атрибутов методов. Например, `meth.im_func` преобразуется в `meth.__func__`.225226**`ne`**227228Преобразует старый синтаксис неравенства, `<>`, в `!=`.229230**`next`**231232Преобразует использование методов `next()` итератора в функцию [`next()`](https://python-all.ru/3.3/library/functions.html#next). Также переименовывает методы [`next()`](https://python-all.ru/3.3/library/functions.html#next) в [`__next__()`](https://python-all.ru/3.3/library/stdtypes.html#iterator.__next__).233234**`nonzero`**235236Переименовывает `__nonzero__()` в [`__bool__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__bool__).237238**`numliterals`**239240Преобразует восьмеричные литералы в новый синтаксис.241242**`operator`**243244Преобразует вызовы различных функций из модуля [`operator`](https://python-all.ru/3.3/library/operator.html#module-operator) в другие, но эквивалентные вызовы функций. При необходимости добавляются соответствующие операторы `import`, например `import collections`. Выполняются следующие преобразования:245246| Из | В |247| --- | --- |248| `operator.isCallable(obj)` | `hasattr(obj, '__call__')` |249| `operator.sequenceIncludes(obj)` | `operator.contains(obj)` |250| `operator.isSequenceType(obj)` | `isinstance(obj, collections.Sequence)` |251| `operator.isMappingType(obj)` | `isinstance(obj, collections.Mapping)` |252| `operator.isNumberType(obj)` | `isinstance(obj, numbers.Number)` |253| `operator.repeat(obj, n)` | `operator.mul(obj, n)` |254| `operator.irepeat(obj, n)` | `operator.imul(obj, n)` |255256**`paren`**257258Добавляет дополнительные круглые скобки там, где они требуются в списковых включениях. Например, `[x for x in 1, 2]` становится `[x for x in (1, 2)]`.259260**`print`**261262Преобразует инструкцию `print` в функцию [`print()`](https://python-all.ru/3.3/library/functions.html#print).263264**`raise`**265266Преобразует `raise E, V` в `raise E(V)`, а `raise E, V, T` в `raise E(V).with_traceback(T)`. Если `E` – кортеж, преобразование будет некорректным, так как подстановка кортежей вместо исключений была удалена в версии 3.0.267268**`raw_input`**269270Преобразует `raw_input()` в [`input()`](https://python-all.ru/3.3/library/functions.html#input).271272**`reduce`**273274Обрабатывает перенос `reduce()` в [`functools.reduce()`](https://python-all.ru/3.3/library/functools.html#functools.reduce).275276**`renames`**277278Изменяет `sys.maxint` на [`sys.maxsize`](https://python-all.ru/3.3/library/sys.html#sys.maxsize).279280**`repr`**281282Заменяет обратные кавычки на функцию [`repr()`](https://python-all.ru/3.3/library/functions.html#repr).283284**`set_literal`**285286Заменяет использование конструктора [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) на литералы множеств. Этот фиксер является необязательным.287288**`standard_error`**289290Переименовывает `StandardError` в [`Exception`](https://python-all.ru/3.3/library/exceptions.html#Exception).291292**`sys_exc`**293294Изменяет устаревшие `sys.exc_value`, `sys.exc_type`, `sys.exc_traceback` на использование [`sys.exc_info()`](https://python-all.ru/3.3/library/sys.html#sys.exc_info).295296**`throw`**297298Исправляет изменение API в методе `throw()` генератора.299300**`tuple_params`**301302Удаляет неявную распаковку параметров кортежа. Этот фиксер вставляет временные переменные.303304**`types`**305306Исправляет код, сломанный удалением некоторых членов модуля [`types`](https://python-all.ru/3.3/library/types.html#module-types).307308**`unicode`**309310Переименовывает `unicode` в [`str`](https://python-all.ru/3.3/library/stdtypes.html#str).311312**`urllib`**313314Обрабатывает переименование [`urllib`](https://python-all.ru/3.3/library/urllib.html#module-urllib) и `urllib2` в пакет [`urllib`](https://python-all.ru/3.3/library/urllib.html#module-urllib).315316**`ws_comma`**317318Удаляет лишние пробелы из элементов, разделённых запятыми. Этот фиксер необязателен.319320**`xrange`**321322Переименовывает `xrange()` в [`range()`](https://python-all.ru/3.3/library/stdtypes.html#range) и оборачивает существующие вызовы [`range()`](https://python-all.ru/3.3/library/stdtypes.html#range) в [`list`](https://python-all.ru/3.3/library/stdtypes.html#list).323324**`xreadlines`**325326Изменяет `for x in file.xreadlines()` на `for x in file`.327328**`zip`**329330Оборачивает использование [`zip()`](https://python-all.ru/3.3/library/functions.html#zip) в вызов [`list`](https://python-all.ru/3.3/library/stdtypes.html#list). Это отключается, когда встречается `from future_builtins import zip`.331332## 26.6.3. [`lib2to3`](https://python-all.ru/3.3/library/2to3.html#module-lib2to3) – библиотека 2to3333334> **Примечание**335>336> API [`lib2to3`](https://python-all.ru/3.3/library/2to3.html#module-lib2to3) следует считать нестабильным и может существенно измениться в будущем.337