Как очистить пакеты, совместимые с Python 2.7 + 3, чтобы сделать их совместимыми только с Python 3.6? - PullRequest
0 голосов
/ 20 сентября 2018

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я нашел отличный инструмент, который делает то, что мне нужно: pyupgrade .

Есть опция --py36-plus, которая вызывает замену большинства "{}".format(var) на f"{var}" (многочище и яснее).

С помощью команды Unix find -name "*.py" | xargs pyupgrade --py36-plus он производит такие коммиты:

https://bitbucket.org/fluiddyn/fluidsim/pull-requests/78/pyupgrade-py36-plus

Теперь код намного чище и яснее и показываетстиль кодирования, который нам нужен сегодня.

Это действительно очень полезно для проектов, которые прекратили поддержку Python 2.7 (см. http://python3statement.org/).

0 голосов
/ 21 сентября 2018

Если ваша цель состоит в том, чтобы остановить запуск кода на 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, к которым у вас есть доступ.Многие из этих вещей потребуют тщательного проектирования, чтобы включить их в вашу программу.Включение их таким образом, что получается действительно хороший код, не является чем-то автоматическим или бессмысленным, быстрым ручным переходом по вашему коду.Попытка рассказать вам, как включить все эти вещи в вашу программу, слишком широка для ответа на переполнение стека;слишком много нового.

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

...