Какие исправители 2to3 выдают корректный код Python 2?
2to3 - это программа на Python, которая читает исходный код Python 2.x и применяет ряд исправлений для преобразования его в действительный код Python 3.x
Рассмотрим сорок исправителей, перечисленных по адресу https://docs.python.org/3.4/library/2to3.html. По замыслу они все выводят действительный код Python 3. Какой вывод правильный код Python 2?
Например, NE исправителя, который "преобразует старый неравный синтаксис <>
в !=
имеет это свойство, потому что !=
действует как Python 2, так и Python 3.
Принимая во внимание, что фиксер NONZERO, что "переименовывает __nonzero__
в __bool__
"не имеет свойства, потому что нет функции __bool__
в Python 2.7.
1 ответ
Из того, что нового в Python 3.0:
Не рекомендуется пытаться писать исходный код, который работает без изменений в Python 2.6 и 3.0; вам придется использовать очень искаженный стиль кодирования, например, избегать операторов печати, метаклассов и многого другого. Если вы поддерживаете библиотеку, которая должна поддерживать и Python 2.6, и Python 3.0, лучше всего изменить вышеприведенный шаг 3, отредактировав версию исходного кода 2.6 и снова запустив транслятор 2to3, а не редактируя версию 3.0 исходный код.
Эта ссылка довольно хорошая, так как она также перечисляет большинство основных новых функций и изменений в 3.0
Что касается вашего вопроса, то самое близкое, что я могу найти к тому, что вы просите, - это Six, который не является конвертером или исправителем, а скорее библиотекой совместимости, которая обрабатывает большую часть искаженного кодирования для вас. Тем не менее, я не знаю, насколько хорошо это работает, и потребуется много изменений в вашем существующем коде, чтобы в любом случае воспользоваться им.
Основная проблема заключается в том, что Python 3.x изменил так много фундаментальных аспектов синтаксиса, что практически невозможно, чтобы один и тот же код работал одинаково на 3.x и 2.x без какого-либо уровня совместимости. Строки Python 2 не совпадают со строками Python 3. То же самое относится и к целым числам, и у Python 3 даже нет длинного типа (целые числа Python 3 - это то, что было раньше, и старый Python 2 int пропал). Многие встроенные функции и атрибуты были переименованы или изменены, и большая часть синтаксиса была изменена или очищена способами, которые полностью нарушают обратную совместимость.
Портирование кода на Python 3 с 2to3 объясняет немного о 2to3 и о том, что он делает, и, надо надеяться, достаточно перечисленных изменений синтаксиса, чтобы объяснить, почему результирующий код больше не будет работать с Python 2.x.