"package === version"形式的setuptools要求的目的是什么

Ste*_*coe 5 python setuptools

假设我有一个包含控制台脚本的包,例如

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',
        ]
   },
)
Run Code Online (Sandbox Code Playgroud)

如果我使用egg_info -b mytag生成的脚本设置和显式构建标记__requires__ = 'eg-package===0.0.1mytag',即使用3"="符号.当标签不像b1测试版那样传统时,会发生这种情况.

起初我认为这是一个错误,但setuptools文档表明它是一个有效的需求标识符.但是,它不适用于旧版本的setuptools,这会导致我们的系统出现问题.

我的问题是什么"==="意思,为什么现代setuptools使用它?

iva*_*eev 3

pip文档中的需求说明符部分链接到由 实现的需求说明符的官方文档setuptools pkg_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 ,就会生成它。

1pkg_resources._vendor.packaging.specifiers._compare_compatible() 2pkg_resources.parse_version()产生 apkg_resources.SetuptoolsLegacyVersion而不是pkg_resources.SetuptoolsVersion