Ответ - не выбирать, пока не заставят вашу руку

Как программист на Python, я всегда сталкиваюсь со следующим вопросом, когда начинаю новый проект:

Что мне делать - на Python 2 или на Python 3?

На первый взгляд ответ кажется очевидным. Python 3 - единственная активно развивающаяся ветвь языка и поддержка python 2.7 будет прекращена после 2020 года. Это веская причина для разработки на Python 3.

Однако принять решение не так-то просто. Доступность сторонних библиотек также является одной из моих основных проблем, поэтому я должен учитывать это при выборе. Что может быть хуже, чем обнаружить, что есть пакет, который может сделать за меня месяц работы, но не может быть использован, потому что я выбрал неправильную вилку языка?

Я знаю, что между Python 2 и Python 3 есть несколько других важных факторов, таких как обработка Unicode, обработка исключений, обработка импорта, не говоря уже о существенных изменениях в стандартной библиотеке. Если вам интересно, вы можете прочитать подробную разбивку различий в этом сообщении в блоге про Python 3, в этом нейтральном сообщении в блоге, в этом пропаганде про Python 2 и его опровержении. Но, на мой взгляд, преимущества или недостатки, которые предлагают эти факторы, часто затмеваются влиянием сторонних библиотек, которые выполняют большую часть тяжелой работы в проекте.

К счастью, с библиотеками не так уж и плохо. Самые популярные пакеты Python совместимы с Python 2 и 3. Настоящая проблема связана с не очень популярными пакетами, которые имеют нишевые варианты использования. В наши дни я очень часто натыкаюсь на отличные сторонние библиотеки, которые изначально были написаны на python 2, но так и не были портированы на python 3. Точно так же существует множество библиотек, написанных на Python 3 с самого начала и которые, следовательно, не работают. Я действительно поддерживаю Python 2.

В идеальном мире я могу попытаться составить список потенциально необходимых пакетов перед запуском проекта, а затем, исходя из их совместимости, принять решение между 2 и 3. Фактически, это официальный совет из Python wiki.

Если вы хотите использовать Python 3.x, но боитесь использовать его из-за зависимости, возможно, сначала стоит провести небольшое исследование.

Но любой, кто когда-либо руководил реальным проектом, знает, насколько несущественным было бы это исследование. Требования продолжают меняться по мере развития проекта, и невозможно предсказать функции, которые вам, возможно, придется реализовать позже, из-за запроса сводки / функции. Следовательно, невозможно предсказать заранее (и глупо пытаться это сделать), какие пакеты могут потребоваться в первый же день.

И все же вы должны принять решение о языке. Вы должны принять это решение прямо сейчас. Может быть, только чтобы потом пожалеть об этом.

2 или 3? 3 или 2? ахх.

Я избегаю всей этой путаницы, настаивая на том, что кодовая база должна быть совместима с Python 2 и 3 с самого начала.

Не только Python 2. Не только Python 3. Но и то и другое.

Я несу небольшие накладные расходы, делая это, но не сильно, потому что python 2 и 3 очень похожие языки. Многие изменения в Python 3 были перенесены в Python 2.7. Краткий объем официальной документации по портированию является еще одним доказательством сходства синтаксиса. В большинстве случаев работает один и тот же код. Время от времени, особенно при работе со строками Unicode, приходится обрабатывать вещи по-разному в зависимости от версий Python.

Я считаю эти накладные расходы взносом на медицинское страхование. Вы платите немного денег каждый месяц, чтобы вам не приходилось платить много денег, когда вы сильно заболеете. Точно так же вы работаете немного больше, чем обычно, ориентируясь на обе версии языка, так что вам не придется много работать, когда вы обнаружите, что один спасательный пакет несовместим с вашей поддерживаемой версией Python.

Конечно, сравнение со страховкой не совсем справедливо, потому что в тот момент, когда вы включите первый такой пакет спасения, он прекратит поддержку одной из версий Python в вашем проекте, и тогда вы вернетесь к исходной точке. Поэтому всякий раз, когда я вижу такой пакет спасения, я задаю себе следующий вопрос:

Сколько времени потребуется, чтобы добавить поддержку неподдерживаемой версии Python в пакет lifesaver?

  1. Если это порядка нескольких дней, то я создаю пул-реквест, добавляя поддержку отсутствующей версии в этот проект (я уже сделал это для python-котелпайп, ark-twokenize-py и в настоящее время в процесс исправления поддержки Python 3 для TweeboParser). В свою очередь, я стал участником проекта с открытым исходным кодом, мой проект остается совместимым как с Python 2, так и с Python 3, и все это хорошо и солнечно.
  2. Если пакет спасателей огромен, тогда я принимаю важное решение отказаться от поддержки Python 2 или Python 3.

Мне нравится такой способ ведения дел, потому что таким образом я могу принять решение, когда мне будет доступна вся необходимая информация. Принятие решения на более раннем этапе было бы больше похоже на бросание дротиков в темноту.

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

Если вам понравилось читать этот пост, нажмите кнопку ❤, чтобы порекомендовать его. Это поможет другим пользователям Medium это обнаружить.