Для чего нужны требования setuptools вида "package===version"

Скажем, у меня есть пакет с консольным скриптом, таким как

from setuptools import setup
setup(
    name='eg_package',
    version='0.0.1',
    description='Trivial test package',
    packages=[
       'eg_package',
    ],
    entry_points={
        'console_scripts': [
            'foo = eg_package.main:main',
        ]
   },
)

Если я установил и явный тег сборки, используя egg_info -b mytag полученный скрипт имеет __requires__ = 'eg-package===0.0.1mytag'с 3 "=" знаками. Это происходит, когда тег не похож на обычный b1 для бета-версии.

Сначала я думал, что это ошибка, но документация по setuptools предполагает, что это допустимый идентификатор требования. Тем не менее, он не работает со старыми версиями setuptools, что вызывает проблемы с нашими системами.

Мой вопрос в том, что делает "===" значит и почему современный setuptools используй это?

1 ответ

Решение

Раздел спецификатора требований в pip документы ссылки на официальные документы для спецификаторов требований, реализуемых setuptoolspkg_resources, Он определяет формальный синтаксис, но ничего не говорит о семантике. Обзорные документы объясняют семантику, но ничего не говорят о ~= а также === вещи, которые, очевидно, были добавлены где-то между vv.7 (установлен с python 2.7.9) и 16.

Когда документы не работают, пришло время обратиться к источникам. Скачиваем setuptools hg репо и комментируем pkg_resources/__init__.py в конечном итоге мы получаем набор изменений 3125 с сообщением "Внедрите PEP 440 с помощью библиотеки упаковки".

Действительно, PEP 440, раздел " Спецификаторы версий", объясняет синтаксис и семантику:

Изучая другие файлы в коммите и связанные с ним packaging Пакет, я пришел к этим очевидным выводам:

  • ~= никогда не производится; при обработке 1 он действует как фильтр в соответствии с правилами, изложенными в PEP.
  • ===, когда обрабатываются, сигналы отступить к старшему setuptools синтаксис версии и логика сравнения. Он создается всякий раз, когда полученная строка версии не соответствует PEP 2.

1 В pkg_resources._vendor.packaging.specifiers._compare_compatible() 2 pkg_resources.parse_version() производит pkg_resources.SetuptoolsLegacyVersion скорее, чем pkg_resources.SetuptoolsVersion

Другие вопросы по тегам