Сравнение строковых представлений версий в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эффективного сравнения номеров версий в Python рекомендуется использовать метод parse из модуля packaging.version:

Python
Скопировать код
from packaging import version

# Установим, какая версия более новая
print(version.parse("2.3.1") < version.parse("2.4.0"))  # Вывод: True, версия 2.4.0 новее 2.3.1

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

Кинга Идем в IT: пошаговый план для смены профессии

Почему стоит уделить внимание модулю packaging.version

Модуль packaging.version соответствует стандарту PEP 440 и предназначен для точного сравнения версий, соответствующих инструкциям PEP. Метод version.parse возвращает объект Version для версий, которые следуют данному стандарту, и LegacyVersion в всех остальных случаях:

Python
Скопировать код
v1 = version.parse("2.0.1")
v2 = version.parse("2.0.1a1")
print(v1 > v2)  # Вывод: True, финальная версия преобладает над альфа-версией

Еще раз подчеркнем: использование packaging.version — дело принципиальное и важное.

Осторожно: se задалбливайтесь от distutils

Здесь важно помнить, что distutils.version устарел и не рекомендован для сравнения версий. Избегайте использования LooseVersion и StrictVersion, отдавая предпочтение методу packaging.version.parse.

Когда версии прячутся за суффиксами

Работа со суффиксами версий (альфа, бета, RC) и метаданными весьма сложна, но модуль packaging.version.parse умеет работать даже с такими нюансами:

Python
Скопировать код
alpha_version = version.parse("1.0a1")
release_version = version.parse("1.0")
assert alpha_version < release_version  # Альфа-версия уступает полноценному релизу. Проверка пройдена!

Хитрость с кортежами: Как упаковать версии для удобства

Простые версии можно эффективно сравнивать с использованием кортежей, это некий аналог их упаковки:

Python
Скопировать код
v1 = tuple(map(int, "1.0.2".split('.')))
v2 = tuple(map(int, "1.0.10".split('.')))
print(v1 < v2)  # Вывод: True, '10' в кортеже больше '2'.

Сравнение номеров версий в виде кортежей целых чисел наглядно и компактно отражает их иерархию.

Инструмент pkg_resources: Универсальный инструмент для работы с версиями

Функция pkg_resources.parse_version универсальна и соответствует PEP440, позволяя корректно работать с версиями в различных форматах:

Python
Скопировать код
from pkg_resources import parse_version

print(parse_version("2.0.1rc1") < parse_version("2.0.1"))  # Вывод: True, release candidate версия уступает финальной версии.

Имейте этот инструмент под рукой, ведь он может оказаться полезным в самый неподходящий момент!

Визуализация

Допустим, у нас имеются две книги по программированию на Python:

  • "Изучаем Python: Издание 3.6.4"
  • "Освоение Python: Издание 3.7.1"

И мы размещаем их на полке:

Ваша книжная полка (📚)

ПозицияИзданиеНазвание книги
13.6.4Изучаем Python
23.7.1Освоение Python

Точно также, как и книги на полке, версия 3.7.1 следует за версией 3.6.4.

Вашему sys.path необходима диета

Контролируя версии в среде Python, иногда полезно загружать только самые свежие версии библиотек:

Python
Скопировать код
sorted_paths = sorted(egg_paths, key=lambda p: version.parse(p.split('-')[1]), reverse=True)
sys.path.extend(sorted_paths[:1])  # Диета для sys.path: выбираем только свежие продукты!

Забота о sys.path — это инвестиция в стабильность вашего проекта.

Искусство сравнения: Положительное использование ресурсов

Выбор между библиотекой packaging.version и pkg_resources важен: первая — проще и быстрее, что позволяет экономить ресурсы.

Лучшие практики и подводные камни: Как избежать версионных ошибок

Только соблюдая определённые принципы и уклоняясь от распространенных ошибок, вы сможете эффективно управлять версиями Python:

Лучшие практики:

  1. Придерживайтесь PEP 440 — это стандарт идентификации версий.
  2. Пользуйтесь методом packaging.version.parse — он не подведет.
  3. В простых случаях можно использовать сравнение кортежей — это простое и элегантное решение.

Потенциальные подводные камни:

  1. Избегайте старого distutils.version.
  2. Не пытайтесь производить ручной разбор строк версий — это может запутать процесс.
  3. Не пренебрегайте пре-релизными и тестовыми версиями — они важны при сравнении версий.

Полезные материалы

  1. Семантическое версионирование 2.0.0 | Семантическое версионирование – Система версионирования.
  2. Как сравнить номера версий в Python? – Stack Overflow – Мнения сообщества и полезные советы по сравнению версий.
  3. packaging · PyPI – Официальная библиотека Python для управления версиями.
  4. GitHub – pypa/packaging: Core utilities for Python packages – Исходный код и документация модуля packaging.
  5. PEP 440 – Версионирование и зависимости – Стандарт Python для версионирования.
  6. Семантическое версионирование не спасет – Критический анализ семантического версионирования.
  7. Работа с версиями — Packaging – Подробное руководство по классам версий модуля packaging.