Как очистить пакеты, совместимые с Python 2.7 + 3, чтобы сделать их совместимыми только с Python 3.6?

1

Для некоторых проектов я хотел бы прекратить поддержку Python 2.7 (см. Http://python3statement.org/) для использования только Python> 3.6 (или, скорее, 3.5 + f-string, например Pypy v6.0).

Первым шагом может стать изменение файла setup.py, чтобы получить явную ошибку, если вы попытаетесь использовать пакет с версией Python без f-строки.

Но тогда есть много работы по переключению на чистый синтаксис Python 3.6 и удалению всех

  • from __future__ import...,

  • try связать с поддержкой Python 2.7,

  • будущее и/или шесть кодов

и заменить во многих местах

  • class MyClass(object)class MyClass:
  • super(MyClass, self)super()
  • "{}".format(foo)f"{foo}"

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

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

Как бы вы преобразовали совместимый с Python 2.7/3.6 код в чистый код Python 3.6? Как вы можете избежать этой скучной работы вручную?

Редактировать после первого ответа

Я думаю, что гипотетическая интернализация (которая во многих случаях не будет прилагаться) не должна мешать нам использовать f-строки, которые просто чище (и немного быстрее).

Я все еще думаю, что модификации, о которых я упоминал, являются разумными.

  • 2
    У StackOverflow есть правило, запрещающее запрашивать рекомендации для библиотек, что иногда кажется глупым, но защищает от большого количества спама. Если вы отредактируете свой ответ, чтобы запросить способ преобразования кода в код Python 3.6 (а не в инструмент), то я смогу увидеть, что этот вопрос вновь открывается.
  • 0
    Спасибо. Я удалил мир "инструмент".
Показать ещё 2 комментария
Теги:
f-string

1 ответ

2

Если ваша цель - остановить запуск вашего кода на pre-Python-3.6, тогда явным образом проверяю на это:

import sys
if sys.version_info < (3, 6):
    raise RuntimeError('my_thing requires a Python version of at least 3.6.')

Если вам больше не нужна поддержка pre-Python-3.6, вам не нужно ничего делать. Ваш код уже отлично подходит Python 3.6.


Попытка пройти всю вашу кодовую базу и трансформировать ее для использования техник, которые не работают в предыдущих версиях, просто вызовет массу ненужного отторжения кода и риск появления ошибок без реального выигрыша. Новые методы не являются даже безусловными обновлениями над старыми; например, если вы пройдете и переключите все форматирование строк на f-строки, вы можете столкнуться с необходимостью повторить все в любом случае, чтобы поддержать интернационализацию, поскольку невозможно интернационализировать форматирование f-строк.

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


Помните, что новые вещи в новых выпусках Python - это не просто такие простые вещи, как 0-аргумент super. Если по какой-то причине вы хотите наполнить свой код полным количеством блестящих новых языковых функций,

и что перед рассмотрением только зависимостей Python 3-only, к которым у вас теперь есть доступ. Многие из этих вещей потребуют тщательной проектной работы для включения в вашу программу. Включение их таким образом, который создает действительно хороший код, не является чем-то автоматическим инструментом или бессмысленным, быстрым ручным переходом через ваш код. Попытка рассказать вам, как включить все эти вещи в вашу программу, слишком широка для ответа на переполнение стека; там слишком много нового.

Кроме того, даже сама стандартная библиотека Python не прилагает никаких усилий для очистки использования шаблонов, совместимых со старыми версиями. Быстрый grep через текущую ветвь CPython master показывает сотни классов, все еще наследующих от object и более тысячи применений str.format которые можно заменить на f-строки.

  • 0
    Извините, но вы не отвечаете на вопрос, и тон вашего ответа неуместен. Я специально спросил для Python 3.5 + f-string, и вы пишете чек, который не будет работать с Pypy 6.0. Тогда вы говорите мне «ничего не меняйте», когда я спрашиваю «как все изменить». Вы не покрываете __future__ , try и future код. И затем вы переключаетесь на причудливые вещи с неподходящей формулировкой («наполняйте свой код как можно большим количеством новых замечательных языковых возможностей»). Обратите внимание, что pathlib не является «блестящей новой языковой функцией» ( pep-428 был создан в 2012 году).
  • 0
    @paugier: Вы задали вопрос о том, как отказаться от поддержки старых версий. Я ответил на этот вопрос и отнесся к «изменить все» как к Y в вашей проблеме XY . Это благотворительная интерпретация вашего вопроса, потому что другая интерпретация заключается в том, что слишком много новых несовместимых функций, а ваш вопрос слишком широк. Если вы хотите сузить область до конкретной языковой функции (например, «как я могу автоматически преобразовать форматирование моей строки в f-строки»), это будет правильно заданный вопрос.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню