Какие исправители 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.

Другие вопросы по тегам