2to3 — Автоматизированная трансляция кода Python 2 в 3¶
2to3 - это программа на языке Python, которая читает исходный код Python 2.x и применяет ряд исправителей для преобразования его в правильный код Python 3.x. Стандартная библиотека содержит богатый набор корректоров, которые справятся почти со всем кодом. Однако библиотека поддержки 2to3 lib2to3 является гибкой и универсальной библиотекой, поэтому для 2to3 можно написать свои собственные фиксаторы.
Использование 2to3¶
2to3 обычно устанавливается вместе с интерпретатором Python в виде скрипта. Он также находится в каталоге Tools/scripts корня Python.
Основными аргументами 2to3 является список файлов или каталогов для преобразования. Каталоги рекурсивно просматриваются в поисках источников Python.
Вот пример исходного файла Python 2.x, example.py:
def greet(name):
print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)
Его можно преобразовать в код Python 3.x с помощью 2to3 в командной строке:
$ 2to3 example.py
Выводится сравнение с исходным файлом. 2to3 также может записать необходимые изменения обратно в исходный файл. (Создается резервная копия исходного файла, если только не указано -n.) Запись изменений обратно разрешается с помощью флага -w:
$ 2to3 -w example.py
После преобразования example.py выглядит следующим образом:
def greet(name):
print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)
Комментарии и точные отступы сохраняются в процессе перевода.
По умолчанию 2to3 запускает набор predefined fixers. Флаг -l перечисляет все доступные фиксаторы. С помощью -f можно указать явный набор исправляющих устройств для запуска. Аналогично, флаг -x явно отключает фиксатор. В следующем примере запускаются только фиксаторы imports и has_key:
$ 2to3 -f imports -f has_key example.py
Эта команда запускает все фиксаторы, кроме фиксатора apply:
$ 2to3 -x apply example.py
Некоторые корректоры являются явными, то есть они не запускаются по умолчанию и должны быть указаны в командной строке для запуска. Здесь, в дополнение к исправлениям по умолчанию, запускается исправление idioms:
$ 2to3 -f all -f idioms example.py
Обратите внимание, что передача all включает все исправления по умолчанию.
Иногда 2to3 находит в вашем исходном коде место, которое необходимо изменить, но 2to3 не может исправить его автоматически. В этом случае 2to3 выведет предупреждение под diff для файла. Вы должны устранить предупреждение, чтобы получить совместимый код версии 3.x.
2to3 также может рефакторить доктесты. Чтобы включить этот режим, используйте флаг -d. Обратите внимание, что рефакторингу будут подвергаться только доктесты. Это также не требует, чтобы модуль был действительным Python. Например, доктесты, подобные примерам в документе reST, также могут быть отрефакторены с помощью этой опции.
Опция -v позволяет выводить дополнительную информацию о процессе перевода.
Поскольку некоторые операторы печати могут быть разобраны как вызовы функций или операторы, 2to3 не всегда может читать файлы, содержащие функцию печати. Когда 2to3 обнаруживает наличие директивы компилятора from __future__ import print_function, он изменяет свою внутреннюю грамматику, чтобы интерпретировать print() как функцию. Это изменение можно также включить вручную с помощью флага -p. Используйте -p для запуска исправлений в коде, в котором уже были преобразованы операторы печати. Также -e можно использовать для превращения exec() в функцию.
Опция -o или --output-dir позволяет указать альтернативный каталог, в который будут записываться обработанные выходные файлы. Флаг -n необходим при использовании этой опции, так как резервные файлы не имеют смысла, если не перезаписывать входные файлы.
Добавлено в версии 3.2.3: Добавлена опция -o.
Флаг -W или --write-unchanged-files указывает 2to3 всегда записывать выходные файлы, даже если в файл не вносилось никаких изменений. Это наиболее полезно при использовании -o, чтобы все дерево исходников Python копировалось с переводом из одного каталога в другой. Эта опция подразумевает флаг -w, так как в противном случае она не имеет смысла.
Добавлено в версии 3.2.3: Был добавлен флаг -W.
Опция --add-suffix задает строку для добавления ко всем именам выходных файлов. Флаг -n необходим при указании этого параметра, так как при записи в разные имена файлов резервное копирование не требуется. Пример:
$ 2to3 -n -W --add-suffix=3 example.py
Приведет к записи преобразованного файла с именем example.py3.
Добавлено в версии 3.2.3: Добавлена опция --add-suffix.
Чтобы перевести весь проект из одного дерева каталогов в другое, используйте:
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
Фиксаторы¶
Каждый шаг преобразования кода заключен в фиксатор. Команда 2to3 -l перечисляет их. Как и documented above, каждый из них можно включать и выключать по отдельности. Более подробно они описаны здесь.
-
apply¶ Удаляет использование
apply(). Например,apply(function, *args, **kwargs)преобразуется вfunction(*args, **kwargs).
-
asserts¶ Заменяет устаревшие имена методов
unittestна правильные.С сайта
На
failUnlessEqual(a, b)assertEquals(a, b)failIfEqual(a, b)assertNotEquals(a, b)failUnless(a)assert_(a)failIf(a)failUnlessRaises(exc, cal)failUnlessAlmostEqual(a, b)assertAlmostEquals(a, b)failIfAlmostEqual(a, b)assertNotAlmostEquals(a, b)
-
buffer¶ Преобразует
bufferвmemoryview. Этот корректор необязателен, поскольку APImemoryviewпохож, но не полностью совпадает с APIbuffer.
-
dict¶ Исправление методов итерации словаря.
dict.iteritems()преобразуется вdict.items(),dict.iterkeys()вdict.keys(), аdict.itervalues()вdict.values(). Аналогично,dict.viewitems(),dict.viewkeys()иdict.viewvalues()преобразуются соответственно вdict.items(),dict.keys()иdict.values(). Он также оборачивает существующие варианты использованияdict.items(),dict.keys()иdict.values()в вызовlist.
-
except¶ Преобразует
except X, Tвexcept X as T.
-
execfile¶ Удаляет использование
execfile(). Аргументexecfile()оборачивается в вызовыopen(),compile()иexec().
-
funcattrs¶ Исправляет атрибуты функций, которые были переименованы. Например,
my_function.func_closureпреобразуется вmy_function.__closure__.
-
future¶ Удаляет утверждения
from __future__ import new_feature.
-
getcwdu¶ Переименовывает
os.getcwdu()вos.getcwd().
-
has_key¶ Изменяет
dict.has_key(key)наkey in dict.
-
idioms¶ Этот дополнительный корректор выполняет несколько преобразований, которые делают код Python более идиоматичным. Сравнения типов
type(x) is SomeClassиtype(x) == SomeClassпреобразуются вisinstance(x, SomeClass).while 1становитсяwhile True. Этот корректор также пытается использоватьsorted()в соответствующих местах. Например, этот блокL = list(some_iterable) L.sort()
меняется на
L = sorted(some_iterable)
-
import¶ Обнаруживает импорты братьев и сестер и преобразует их в относительные импорты.
-
imports¶ Обрабатывает переименование модулей в стандартной библиотеке.
-
imports2¶ Обрабатывает переименования других модулей в стандартной библиотеке. Он отделен от корректора
importsтолько из-за технических ограничений.
-
input¶ Преобразует
input(prompt)вeval(input(prompt)).
-
intern¶ Преобразует
intern()вsys.intern().
-
isinstance¶ Исправляет дублирование типов во втором аргументе
isinstance(). Например,isinstance(x, (int, int))преобразуется вisinstance(x, int), аisinstance(x, (int, float, int))преобразуется вisinstance(x, (int, float)).
-
itertools_imports¶ Удаляет импорт
itertools.ifilter(),itertools.izip()иitertools.imap(). Импортitertools.ifilterfalse()также изменяется наitertools.filterfalse().
-
itertools¶ Изменяет использование
itertools.ifilter(),itertools.izip()иitertools.imap()на их встроенные эквиваленты.itertools.ifilterfalse()заменяется наitertools.filterfalse().
-
map¶ Заворачивает
map()в вызовlist. Он также изменяетmap(None, x)наlist(x). Использованиеfrom future_builtins import mapотключает этот корректор.
-
metaclass¶ Преобразует старый синтаксис метакласса (
__metaclass__ = Metaв теле класса) в новый (class X(metaclass=Meta)).
-
methodattrs¶ Исправляет старые имена атрибутов методов. Например,
meth.im_funcпреобразуется вmeth.__func__.
-
ne¶ Преобразует старый синтаксис не-равных,
<>, в!=.
-
next¶ Преобразует использование методов итератора
next()в функциюnext(). Она также переименовывает методыnext()в__next__().
-
nonzero¶ Переименовывает определения методов с именем
__nonzero__()в__bool__().
-
numliterals¶ Преобразует восьмеричные литералы в новый синтаксис.
-
operator¶ Преобразует вызовы различных функций в модуле
operatorв другие, но эквивалентные вызовы функций. При необходимости добавляются соответствующие утвержденияimport, напримерimport collections.abc. Выполняется следующее отображение:С сайта
На
operator.isCallable(obj)callable(obj)operator.sequenceIncludes(obj)operator.contains(obj)operator.isSequenceType(obj)isinstance(obj, collections.abc.Sequence)operator.isMappingType(obj)isinstance(obj, collections.abc.Mapping)operator.isNumberType(obj)isinstance(obj, numbers.Number)operator.repeat(obj, n)operator.mul(obj, n)operator.irepeat(obj, n)operator.imul(obj, n)
-
paren¶ Добавьте дополнительные скобки там, где они требуются при составлении списков. Например,
[x for x in 1, 2]становится[x for x in (1, 2)].
-
raise¶ Преобразует
raise E, Vвraise E(V), аraise E, V, Tвraise E(V).with_traceback(T). ЕслиEявляется кортежем, перевод будет неверным, поскольку замена кортежей на исключения была удалена в версии 3.0.
-
reduce¶ Обрабатывает перемещение
reduce()вfunctools.reduce().
-
reload¶ Преобразует
reload()вimportlib.reload().
-
renames¶ Изменяет
sys.maxintнаsys.maxsize.
-
set_literal¶ Заменяет использование конструктора
setна литералы множеств. Это исправление необязательно.
-
sys_exc¶ Изменяет устаревшие
sys.exc_value,sys.exc_type,sys.exc_tracebackна использованиеsys.exc_info().
-
throw¶ Исправляет изменение API в методе генератора
throw().
-
tuple_params¶ Удаляет неявную распаковку параметров кортежа. Этот исправитель вставляет временные переменные.
-
ws_comma¶ Удаляет лишние пробелы из элементов, разделенных запятыми. Этот корректор необязателен.
-
xreadlines¶ Изменяет
for x in file.xreadlines()наfor x in file.
lib2to3 — библиотека 2to3¶
Исходный код: Lib/lib2to3/.
Deprecated since version 3.11, will be removed in version 3.13: Python 3.9 перешел на синтаксический анализатор PEG (см. PEP 617), а lib2to3 использует менее гибкий синтаксический анализатор LL(1). Python 3.10 включает новый синтаксис языка, который не разбирается LL(1) синтаксическим анализатором lib2to3 (см. PEP 634). Модуль lib2to3 был помечен как ожидающий устаревания в Python 3.9 (выдавая PendingDeprecationWarning при импорте) и полностью устарел в Python 3.11 (выдавая DeprecationWarning). Он будет удален из стандартной библиотеки в Python 3.13. Рассмотрите альтернативы сторонних разработчиков, такие как LibCST или parso.
Примечание
API lib2to3 следует считать нестабильным и в будущем он может сильно измениться.