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

2to3.md

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

1> **Источник:** https://python-all.ru/3.1/library/2to3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 25.4. 2to3 – автоматическое преобразование кода Python 2 в 3892to3 – это программа на Python, которая читает исходный код Python 2.x и применяет ряд *преобразователей* для преобразования его в корректный код Python 3.x. Стандартная библиотека содержит обширный набор преобразователей, которые справляются почти с любым кодом. Однако библиотека поддержки 2to3 `lib2to3` – это гибкая и универсальная библиотека, поэтому можно писать собственные преобразователи для 2to3. `lib2to3` также можно адаптировать для заказных приложений, в которых требуется автоматически редактировать код Python.1011## 25.4.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.1/library/2to3.html#to3-fixers). Флаг *-l* выводит список всех доступных преобразователей. Явный набор преобразователей для запуска можно задать с помощью *-f*. Аналогично, *-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 также может рефакторить доктесты. Чтобы включить этот режим, используйте флаг *-d*. Обратите внимание, что *только* доктесты будут подвергнуты рефакторингу. При этом не требуется, чтобы модуль был корректным Python. Например, примеры в стиле доктестов в документе reST также можно рефакторить с помощью этой опции.7475Опция *-v* включает вывод дополнительной информации о процессе преобразования.7677Поскольку некоторые операторы print можно разобрать как вызовы функций или как инструкции, 2to3 не всегда может читать файлы, содержащие функцию print. Когда 2to3 обнаруживает указание компилятора `from __future__ import print_function`, он изменяет свою внутреннюю грамматику, чтобы интерпретировать [`print()`](https://python-all.ru/3.1/library/functions.html#print) как функцию. Это изменение также можно включить вручную с помощью флага *-p*. Используйте *-p* для запуска фиксеров на коде, в котором операторы print уже преобразованы.7879## 25.4.2. Фиксеры8081Каждый шаг преобразования кода инкапсулирован в фиксере. Команда `2to3 -l` выводит их список. Как уже [*описано выше*](https://python-all.ru/3.1/library/2to3.html#to3-using), каждый можно включить или отключить по отдельности. Ниже они описаны подробнее.8283**`apply`**8485Удаляет использование8687`apply()`8889. Например,9091`apply(function, *args, **kwargs)`9293преобразуется в9495`function(*args, **kwargs)`9697.9899**`basestring`**100101Преобразует102103`basestring`104105в106107[`str`](https://python-all.ru/3.1/library/functions.html#str)108109.110111**`buffer`**112113Преобразует114115`buffer`116117в118119[`memoryview`](https://python-all.ru/3.1/library/stdtypes.html#memoryview)120121. Этот фиксер необязателен, поскольку API122123[`memoryview`](https://python-all.ru/3.1/library/stdtypes.html#memoryview)124125похож, но не полностью совпадает с API126127`buffer`128129.130131**`callable`**132133Преобразует134135`callable(x)`136137в138139`isinstance(x, collections.Callable)`140141, добавляя импорт142143[`collections`](https://python-all.ru/3.1/library/collections.html#module-collections)144145при необходимости.146147**`dict`**148149Исправляет методы итерации словарей.150151`dict.iteritems()`152153преобразуется в154155[`dict.items()`](https://python-all.ru/3.1/library/stdtypes.html#dict.items)156157,158159`dict.iterkeys()`160161в162163[`dict.keys()`](https://python-all.ru/3.1/library/stdtypes.html#dict.keys)164165, а166167`dict.itervalues()`168169в170171[`dict.values()`](https://python-all.ru/3.1/library/stdtypes.html#dict.values)172173. Аналогично,174175`dict.viewitems()`176177,178179`dict.viewkeys()`180181и182183`dict.viewvalues()`184185преобразуются соответственно в186187[`dict.items()`](https://python-all.ru/3.1/library/stdtypes.html#dict.items)188189,190191[`dict.keys()`](https://python-all.ru/3.1/library/stdtypes.html#dict.keys)192193и194195[`dict.values()`](https://python-all.ru/3.1/library/stdtypes.html#dict.values)196197. Кроме того, он оборачивает существующие использования198199[`dict.items()`](https://python-all.ru/3.1/library/stdtypes.html#dict.items)200201,202203[`dict.keys()`](https://python-all.ru/3.1/library/stdtypes.html#dict.keys)204205и206207[`dict.values()`](https://python-all.ru/3.1/library/stdtypes.html#dict.values)208209в вызов210211[`list`](https://python-all.ru/3.1/library/functions.html#list)212213.214215**`except`**216217Преобразует218219`except X, T`220221в222223`except X as T`224225.226227**`exec`**228229Преобразует инструкцию230231`exec`232233в функцию234235[`exec()`](https://python-all.ru/3.1/library/functions.html#exec)236237.238239**`execfile`**240241Удаляет использование242243`execfile()`244245. Аргумент246247`execfile()`248249оборачивается вызовами250251[`open()`](https://python-all.ru/3.1/library/functions.html#open)252253,254255[`compile()`](https://python-all.ru/3.1/library/functions.html#compile)256257и258259[`exec()`](https://python-all.ru/3.1/library/functions.html#exec)260261.262263**`exitfunc`**264265Заменяет присваивание266267`sys.exitfunc`268269на использование модуля270271[`atexit`](https://python-all.ru/3.1/library/atexit.html#module-atexit)272273.274275**`filter`**276277Оборачивает использование278279[`filter()`](https://python-all.ru/3.1/library/functions.html#filter)280281в вызов282283[`list`](https://python-all.ru/3.1/library/functions.html#list)284285.286287**`funcattrs`**288289Исправляет атрибуты функций, которые были переименованы. Например,290291`my_function.func_closure`292293преобразуется в294295`my_function.__closure__`296297.298299**`future`**300301Удаляет операторы302303`from __future__ import new_feature`304305.306307**`getcwdu`**308309Переименовывает310311`os.getcwdu()`312313в314315[`os.getcwd()`](https://python-all.ru/3.1/library/os.html#os.getcwd)316317.318319**`has_key`**320321Заменяет322323`dict.has_key(key)`324325на326327`key in dict`328329.330331**`idioms`**332333Этот дополнительный фиксер выполняет несколько преобразований, делающих код Python более идиоматичным. Сравнения типов, такие как `type(x) is SomeClass` и `type(x) == SomeClass`, преобразуются в `isinstance(x, SomeClass)`. `while 1` становится `while True`. Этот фиксер также старается использовать [`sorted()`](https://python-all.ru/3.1/library/functions.html#sorted) в подходящих местах. Например, этот блок334335```python336L = list(some_iterable)337L.sort()338```339340изменяется на341342```python343L = sorted(some_iterable)344```345346**`import`**347348Обнаруживает импорты соседних модулей и преобразует их в относительные импорты.349350**`imports`**351352Обрабатывает переименования модулей в стандартной библиотеке.353354**`imports2`**355356Обрабатывает переименования других модулей в стандартной библиотеке. Он отделён от фиксера357358[`imports`](https://python-all.ru/3.1/library/2to3.html#2to3fixer-imports)359360только из-за технических ограничений.361362**`input`**363364Преобразует365366`input(prompt)`367368в369370`eval(input(prompt))`371372**`intern`**373374Преобразует375376`intern()`377378в379380[`sys.intern()`](https://python-all.ru/3.1/library/sys.html#sys.intern)381382.383384**`isinstance`**385386Исправляет дублирующиеся типы во втором аргументе387388[`isinstance()`](https://python-all.ru/3.1/library/functions.html#isinstance)389390. Например,391392`isinstance(x, (int, int))`393394преобразуется в395396`isinstance(x, (int))`397398.399400**`itertools_imports`**401402Удаляет импорты403404`itertools.ifilter()`405406,407408`itertools.izip()`409410и411412`itertools.imap()`413414. Импорты415416`itertools.ifilterfalse()`417418также заменяются на419420[`itertools.filterfalse()`](https://python-all.ru/3.1/library/itertools.html#itertools.filterfalse)421422.423424**`itertools`**425426Заменяет использование427428`itertools.ifilter()`429430,431432`itertools.izip()`433434и435436`itertools.imap()`437438на их встроенные эквиваленты.439440`itertools.ifilterfalse()`441442заменяется на443444[`itertools.filterfalse()`](https://python-all.ru/3.1/library/itertools.html#itertools.filterfalse)445446.447448**`long`**449450Убирает префикс451452`L`453454у литералов длинных целых и переименовывает455456`long`457458в459460[`int`](https://python-all.ru/3.1/library/functions.html#int)461462.463464**`map`**465466Оборачивает467468[`map()`](https://python-all.ru/3.1/library/functions.html#map)469470в вызов471472[`list`](https://python-all.ru/3.1/library/functions.html#list)473474. Также заменяет475476`map(None, x)`477478на479480`list(x)`481482. Использование483484`from future_builtins import map`485486отключает этот фиксер.487488**`metaclass`**489490Преобразует старый синтаксис метакласса (491492`__metaclass__ = Meta`493494в теле класса) в новый (495496`class X(metaclass=Meta)`497498).499500**`methodattrs`**501502Исправляет старые имена атрибутов методов. Например,503504`meth.im_func`505506преобразуется в507508`meth.__func__`509510.511512**`ne`**513514Преобразует старый синтаксис неравенства,515516`<>`517518, в519520`!=`521522.523524**`next`**525526Преобразует использование метода527528`next()`529530итератора в вызов функции531532[`next()`](https://python-all.ru/3.1/library/functions.html#next)533534. Также переименовывает методы535536[`next()`](https://python-all.ru/3.1/library/functions.html#next)537538в539540`__next__()`541542.543544**`nonzero`**545546Переименовывает547548`__nonzero__()`549550в551552[`__bool__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__bool__)553554.555556**`numliterals`**557558Преобразует восьмеричные литералы в новый синтаксис.559560**`paren`**561562Добавляет дополнительные круглые скобки там, где они требуются в списковых включениях. Например,563564`[x for x in 1, 2]`565566становится567568`[x for x in (1, 2)]`569570.571572**`print`**573574Преобразует инструкцию575576`print`577578в функцию579580[`print()`](https://python-all.ru/3.1/library/functions.html#print)581582.583584**`raise`**585586Преобразует587588`raise E, V`589590в591592`raise E(V)`593594, а595596`raise E, V, T`597598в599600`raise E(V).with_traceback(T)`601602. Если603604`E`605606– кортеж, преобразование будет некорректным, так как подстановка кортежей вместо исключений была удалена в версии 3.0.607608**`raw_input`**609610Преобразует611612`raw_input()`613614в615616[`input()`](https://python-all.ru/3.1/library/functions.html#input)617618.619620**`reduce`**621622Обрабатывает перенос623624`reduce()`625626в627628[`functools.reduce()`](https://python-all.ru/3.1/library/functools.html#functools.reduce)629630.631632**`renames`**633634Изменяет635636`sys.maxint`637638на639640[`sys.maxsize`](https://python-all.ru/3.1/library/sys.html#sys.maxsize)641642.643644**`repr`**645646Заменяет обратные кавычки на функцию647648[`repr()`](https://python-all.ru/3.1/library/functions.html#repr)649650.651652**`set_literal`**653654Заменяет использование конструктора655656[`set`](https://python-all.ru/3.1/library/stdtypes.html#set)657658на литералы множеств. Этот фиксер является необязательным.659660**`standard_error`**661662Переименовывает663664`StandardError`665666в667668[`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception)669670.671672**`sys_exc`**673674Изменяет устаревшие675676`sys.exc_value`677678,679680`sys.exc_type`681682,683684`sys.exc_traceback`685686на использование687688[`sys.exc_info()`](https://python-all.ru/3.1/library/sys.html#sys.exc_info)689690.691692**`throw`**693694Исправляет изменение API в методе695696`throw()`697698генератора.699700**`tuple_params`**701702Удаляет неявную распаковку параметров кортежа. Этот фиксер вставляет временные переменные.703704**`types`**705706Исправляет код, сломанный удалением некоторых членов модуля707708[`types`](https://python-all.ru/3.1/library/types.html#module-types)709710.711712**`unicode`**713714Переименовывает715716`unicode`717718в719720[`str`](https://python-all.ru/3.1/library/functions.html#str)721722.723724**`urllib`**725726Обрабатывает переименование727728`urllib`729730и731732`urllib2`733734в735736`urllib`737738пакет.739740**`ws_comma`**741742Удаляет лишние пробелы из элементов, разделённых запятыми. Этот фиксер необязателен.743744**`xrange`**745746Переименовывает747748`xrange()`749750в751752[`range()`](https://python-all.ru/3.1/library/functions.html#range)753754и оборачивает существующие вызовы755756[`range()`](https://python-all.ru/3.1/library/functions.html#range)757758в759760[`list`](https://python-all.ru/3.1/library/functions.html#list)761762.763764**`xreadlines`**765766Изменяет767768`for x in file.xreadlines()`769770на771772`for x in file`773774.775776**`zip`**777778Оборачивает использование779780[`zip()`](https://python-all.ru/3.1/library/functions.html#zip)781782в вызов783784[`list`](https://python-all.ru/3.1/library/functions.html#list)785786. Это отключается, когда встречается787788`from future_builtins import zip`789790.791792## 25.4.3. `lib2to3` – библиотека 2to3793794> **Примечание**795>796> API `lib2to3` следует считать нестабильным и в будущем оно может кардинально измениться.797