Каков предпочтительный метод в сообществе для использования Python 2.x и 3.x в одной кодовой базе? - PullRequest
2 голосов
/ 17 мая 2011

Я начинаю проект в Python 3.x, (я довольно новичок в Python), и существует возможность, что мне нужно будет использовать, скажем, Thrift или любую другую библиотеку, которая еще не портирована в Python 3.x.

Я не возражаю потратить некоторое (существенное) время на преобразование внешней библиотеки в Python 3.x, если с этим могут извлечь выгоду другие, но мне любопытно, есть ли какой-нибудь предпочтительный способв сообществе Open Source для решения этой проблемы.

Я читал кое-что на сайте python.org и на некоторых других сайтах, но я не нашел ничего убедительного.Единственное, что я обнаружил, это то, что это проблема курицы и яйца.

Не может быть и речи (если нет другого выбора), что я отправляю дамп библиотеки со своими собственными модификациями только длясделайте его совместимым с 3.x.

Должен ли я ...

  1. подготовить весь код с помощью __future import, соответствующим образом изменить кое-где и оставить его готовым к работе соба 2.x и 3.x?Собираюсь ли я найти с этим какую-либо проблему, кроме естественного сопротивления вышестоящих подразделений интегрировать такое количество изменений?

  2. создать еще одну ветвь кода?Для меня это должно быть совершенно бесполезно, так как никто, кроме меня, вероятно, не поддержит эту ветвь, и это требует огромных усилий по дублированию.

  3. использовать какой-то тип оболочки, который я не знаюиспользовать эти библиотеки как есть (например, использовать некоторые промежуточные привязки на другом языке) и просто создать клей в моем коде?

Большое спасибо!

Ответы [ 5 ]

2 голосов
/ 17 мая 2011

Существуют различные стратегии, которые вы можете использовать, и которые лучше всего зависят от нескольких вещей, таких как то, что вы переносите, насколько он сложен и сколько внутренних компонентов Pythons он использует. В основном, если вы хотите поддерживать как Python 2, так и Python 3 одновременно, запустите 2to3 для своего кода и посмотрите, насколько он изменится. Если изменения в основном сводятся к тому, что вы можете решить с помощью импорта __future__, тогда возможен переход на Python 3 и повторное введение совместимости с Python 2. (Подробное описание см. На моей странице Стратегии миграции .)

Если изменения значительны, вам, вероятно, лучше использовать 2to3 для поддержки Python 3. Это станет проще, если вы сможете использовать Distribute для упаковки вашего проекта.

В обоих случаях вы можете использовать six .

См. Также мой доклад на эту тему .

2 голосов
/ 17 мая 2011

Подход, который я использовал, - поддерживать код в формате версии 2, использовать конвертер 2to3 и проверять вывод в версии 3. Если в сгенерированном коде версии 3 есть ошибки, я работаю с версией 2код, чтобы получить лучшее преобразование, пока оно не работает.Вики Python имеет несколько полезных советов по этому поводу: http://wiki.python.org/moin/Python2orPython3

PEP 3000 также есть несколько полезных советов по поддержке кодовой базы с двумя версиями.

Когда ваша библиотеканаконец, 3.x-ready (возможно, делая это самостоятельно), тогда у вас есть готовая к работе кодовая база 3.x.

2 голосов
/ 17 мая 2011

Я не могу говорить от сообщества, но эти from __future__ import ... не работают для всех версий Python или не надежны в некоторых случаях.

print_function и unicode_literals были добавлены на Python2.6, with_statement на Python2.5 и другие на Python2.2

Итак, если вы хотите поддерживать 2.6 или более позднюю версию, все в порядке.Если вам все еще требуется поддержка 2.5 или, что еще хуже, 2.4, вам потребуется другой подход.

Использование from __future__ import unicode_literals не будет работать должным образом, поскольку Python2 позволяет выполнять преобразование из байта в юникод без кодирования, в то время как Python3 не«т.Кроме того, вызов str или bytes имеет разные аргументы.

Разница в обработке строк, по-видимому, является главной проблемой для обеспечения совместимости программы с Python2 и Python3.

2 голосов
/ 17 мая 2011

Я предлагаю поддерживать Python 2.x и Python 3.x одновременно из одной базы кода, используя tox .Прочитайте Поддержка всех версий Python все время с Tox доклад Pycon 2011.

1 голос
/ 17 мая 2011

http://docs.python.org/dev/howto/pyporting.html - источник самых последних советов от разработчиков ядра CPython (хотя, похоже, вы уже смотрели на это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...