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

2to3.md

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

1> **Источник:** https://python-all.ru/2.6/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/2.6/library/2to3.html#to3-fixers). Флаг *-l* выводит список всех доступных преобразователей. Явный набор запускаемых преобразователей можно задать с помощью *-f*. Аналогично [*-x*](https://python-all.ru/2.6/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/2.6/using/cmdline.html#cmdoption-d). Обратите внимание, что *только* doctest'ы будут подвергнуты рефакторингу. При этом модуль не обязан быть корректным Python. Например, примеры в стиле doctest в reST-документе также можно рефакторить с помощью этой опции.7475Опция [*-v*](https://python-all.ru/2.6/using/cmdline.html#cmdoption-v) включает вывод дополнительной информации о процессе перевода.7677Так как некоторые операторы print могут интерпретироваться как вызовы функций или операторы, 2to3 не всегда может читать файлы, содержащие функцию print. Когда 2to3 обнаруживает наличие директивы компилятора `from __future__ import print_function`, он изменяет свою внутреннюю грамматику, чтобы интерпретировать [`print()`](https://python-all.ru/2.6/library/functions.html#print) как функцию. Это изменение также можно включить вручную с помощью флага *-p*. Используйте *-p* для запуска исправлений на коде, в котором уже преобразованы операторы print.7879## 25.4.2. Фиксеры8081Каждый шаг преобразования кода инкапсулирован в фиксере. Команда `2to3 -l` выводит их список. Как уже [*описано выше*](https://python-all.ru/2.6/library/2to3.html#to3-using), каждый можно включить или отключить по отдельности. Ниже они описаны подробнее.8283**`apply`**8485Удаляет использование8687[`apply()`](https://python-all.ru/2.6/library/functions.html#apply)8889. Например,9091`apply(function, *args, **kwargs)`9293преобразуется в9495`function(*args, **kwargs)`9697.9899**`basestring`**100101Преобразует102103[`basestring`](https://python-all.ru/2.6/library/functions.html#basestring)104105в106107[`str`](https://python-all.ru/2.6/library/functions.html#str)108109.110111**`buffer`**112113Преобразует114115[`buffer`](https://python-all.ru/2.6/library/functions.html#buffer)116117в118119`memoryview`120121. Этот исправитель необязателен, потому что API122123`memoryview`124125похож, но не полностью идентичен API126127[`buffer`](https://python-all.ru/2.6/library/functions.html#buffer)128129.130131**`callable`**132133Преобразует134135`callable(x)`136137в138139`isinstance(x, collections.Callable)`140141, добавляя импорт142143[`collections`](https://python-all.ru/2.6/library/collections.html#module-collections)144145при необходимости.146147**`dict`**148149Исправляет методы итерации словарей.150151[`dict.iteritems()`](https://python-all.ru/2.6/library/stdtypes.html#dict.iteritems)152153преобразуется в154155[`dict.items()`](https://python-all.ru/2.6/library/stdtypes.html#dict.items)156157,158159[`dict.iterkeys()`](https://python-all.ru/2.6/library/stdtypes.html#dict.iterkeys)160161– в162163[`dict.keys()`](https://python-all.ru/2.6/library/stdtypes.html#dict.keys)164165, а166167[`dict.itervalues()`](https://python-all.ru/2.6/library/stdtypes.html#dict.itervalues)168169– в170171[`dict.values()`](https://python-all.ru/2.6/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/2.6/library/stdtypes.html#dict.items)188189,190191[`dict.keys()`](https://python-all.ru/2.6/library/stdtypes.html#dict.keys)192193и194195[`dict.values()`](https://python-all.ru/2.6/library/stdtypes.html#dict.values)196197. Также существующие использования198199[`dict.items()`](https://python-all.ru/2.6/library/stdtypes.html#dict.items)200201,202203[`dict.keys()`](https://python-all.ru/2.6/library/stdtypes.html#dict.keys)204205и206207[`dict.values()`](https://python-all.ru/2.6/library/stdtypes.html#dict.values)208209оборачиваются в вызов210211[`list`](https://python-all.ru/2.6/library/functions.html#list)212213.214215**`except`**216217Преобразует218219`except X, T`220221в222223`except X as T`224225.226227**`exec`**228229Преобразует оператор230231[`exec`](https://python-all.ru/2.6/reference/simple_stmts.html#exec)232233в функцию234235`exec()`236237.238239**`execfile`**240241Удаляет использование242243[`execfile()`](https://python-all.ru/2.6/library/functions.html#execfile)244245. Аргумент246247[`execfile()`](https://python-all.ru/2.6/library/functions.html#execfile)248249оборачивается в вызовы250251[`open()`](https://python-all.ru/2.6/library/functions.html#open)252253,254255[`compile()`](https://python-all.ru/2.6/library/functions.html#compile)256257и258259`exec()`260261.262263**`exitfunc`**264265Заменяет присваивание266267[`sys.exitfunc`](https://python-all.ru/2.6/library/sys.html#sys.exitfunc)268269использованием модуля270271[`atexit`](https://python-all.ru/2.6/library/atexit.html#module-atexit)272273.274275**`filter`**276277Оборачивает использование278279[`filter()`](https://python-all.ru/2.6/library/functions.html#filter)280281в вызов282283[`list`](https://python-all.ru/2.6/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()`](https://python-all.ru/2.6/library/os.html#os.getcwdu)312313в314315[`os.getcwd()`](https://python-all.ru/2.6/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/2.6/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/2.6/library/2to3.html#2to3fixer-imports)359360только из-за технических ограничений.361362**`input`**363364Преобразует365366`input(prompt)`367368в369370`eval(input(prompt))`371372**`intern`**373374Преобразует375376[`intern()`](https://python-all.ru/2.6/library/functions.html#intern)377378в379380`sys.intern()`381382.383384**`isinstance`**385386Исправляет дублирующиеся типы во втором аргументе387388[`isinstance()`](https://python-all.ru/2.6/library/functions.html#isinstance)389390. Например,391392`isinstance(x, (int, int))`393394преобразуется в395396`isinstance(x, (int))`397398.399400**`itertools_imports`**401402Удаляет импорты403404[`itertools.ifilter()`](https://python-all.ru/2.6/library/itertools.html#itertools.ifilter)405406,407408[`itertools.izip()`](https://python-all.ru/2.6/library/itertools.html#itertools.izip)409410и411412[`itertools.imap()`](https://python-all.ru/2.6/library/itertools.html#itertools.imap)413414. Импорты415416[`itertools.ifilterfalse()`](https://python-all.ru/2.6/library/itertools.html#itertools.ifilterfalse)417418также заменяются на419420`itertools.filterfalse()`421422.423424**`itertools`**425426Изменяет использование427428[`itertools.ifilter()`](https://python-all.ru/2.6/library/itertools.html#itertools.ifilter)429430,431432[`itertools.izip()`](https://python-all.ru/2.6/library/itertools.html#itertools.izip)433434и435436[`itertools.imap()`](https://python-all.ru/2.6/library/itertools.html#itertools.imap)437438на их встроенные эквиваленты.439440[`itertools.ifilterfalse()`](https://python-all.ru/2.6/library/itertools.html#itertools.ifilterfalse)441442заменяется на443444`itertools.filterfalse()`445446.447448**`long`**449450Убирает префикс451452`L`453454у длинных литералов и переименовывает455456[`long`](https://python-all.ru/2.6/library/functions.html#long)457458в459460[`int`](https://python-all.ru/2.6/library/functions.html#int)461462.463464**`map`**465466Оборачивает467468[`map()`](https://python-all.ru/2.6/library/functions.html#map)469470в вызов471472[`list`](https://python-all.ru/2.6/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()`](https://python-all.ru/2.6/library/stdtypes.html#iterator.next)529530итератора в функцию531532[`next()`](https://python-all.ru/2.6/library/functions.html#next)533534. Также переименовывает методы535536[`next()`](https://python-all.ru/2.6/library/functions.html#next)537538в539540`__next__()`541542.543544**`nonzero`**545546Переименовывает547548[`__nonzero__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__nonzero__)549550в551552`__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`](https://python-all.ru/2.6/reference/simple_stmts.html#print)577578в функцию579580[`print()`](https://python-all.ru/2.6/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()`](https://python-all.ru/2.6/library/functions.html#raw_input)613614в615616[`input()`](https://python-all.ru/2.6/library/functions.html#input)617618.619620**`reduce`**621622Обрабатывает перенос623624[`reduce()`](https://python-all.ru/2.6/library/functions.html#reduce)625626в627628[`functools.reduce()`](https://python-all.ru/2.6/library/functools.html#functools.reduce)629630.631632**`renames`**633634Изменяет635636[`sys.maxint`](https://python-all.ru/2.6/library/sys.html#sys.maxint)637638на639640[`sys.maxsize`](https://python-all.ru/2.6/library/sys.html#sys.maxsize)641642.643644**`repr`**645646Заменяет обратные кавычки на функцию647648[`repr()`](https://python-all.ru/2.6/library/functions.html#repr)649650.651652**`set_literal`**653654Заменяет использование конструктора655656[`set`](https://python-all.ru/2.6/library/stdtypes.html#set)657658на литералы множеств. Этот фиксер является необязательным.659660**`standard_error`**661662Переименовывает663664[`StandardError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.StandardError)665666в667668[`исключение`](https://python-all.ru/2.6/library/exceptions.html#exceptions.Exception)669670.671672**`sys_exc`**673674Изменяет устаревшие675676[`sys.exc_value`](https://python-all.ru/2.6/library/sys.html#sys.exc_value)677678,679680[`sys.exc_type`](https://python-all.ru/2.6/library/sys.html#sys.exc_type)681682,683684[`sys.exc_traceback`](https://python-all.ru/2.6/library/sys.html#sys.exc_traceback)685686на использование687688[`sys.exc_info()`](https://python-all.ru/2.6/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/2.6/library/types.html#module-types)709710.711712**`unicode`**713714Переименовывает715716[`unicode`](https://python-all.ru/2.6/library/functions.html#unicode)717718в719720[`str`](https://python-all.ru/2.6/library/functions.html#str)721722.723724**`urllib`**725726Обрабатывает переименование727728[`urllib`](https://python-all.ru/2.6/library/urllib.html#module-urllib)729730и731732[`urllib2`](https://python-all.ru/2.6/library/urllib2.html#module-urllib2)733734в735736[`urllib`](https://python-all.ru/2.6/library/urllib.html#module-urllib)737738пакет.739740**`ws_comma`**741742Удаляет лишние пробелы из элементов, разделённых запятыми. Этот фиксер необязателен.743744**`xrange`**745746Переименовывает747748[`xrange()`](https://python-all.ru/2.6/library/functions.html#xrange)749750в751752[`range()`](https://python-all.ru/2.6/library/functions.html#range)753754и оборачивает существующие755756[`range()`](https://python-all.ru/2.6/library/functions.html#range)757758вызовы в759760[`list`](https://python-all.ru/2.6/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/2.6/library/functions.html#zip)781782в вызов783784[`list`](https://python-all.ru/2.6/library/functions.html#list)785786. Это отключается, когда встречается787788`from future_builtins import zip`789790.791792## 25.4.3. `lib2to3` – библиотека 2to3793794> **Примечание**795>796> API `lib2to3` следует считать нестабильным и в будущем оно может кардинально измениться.797