我正在尝试编写一个函数来复制 python_requires
的行为来自setup.py
,因为我在setuptools和pip的源码中没找到实现。比较 Python 中的版本号 should be easy enough ,我正在使用 packaging.version它为我完成了所有工作,除了......
让我们看一下像 ">=2.6, !=3.0.*, !=3.1.*"
这样的版本字符串。我按每个逗号分开,然后分别查看每个比较:
from packaging import version
version.parse("3.0.5") >= version.parse("2.6")
正如预期的那样,3.0.5 版本高于 2.6。下一篇:
version.parse("3.0.5") != version.parse("3.0.*")
这将返回 True(即 3.0.5
与 3.0.*
不同),但版本 3.0.5
实际上应该匹配 3.0.*
。 Python 中是否有标准方法来检查带有通配符的版本号是否与另一个版本号匹配?
编辑:也相关,我将如何实现兼容的版本匹配器,例如 ~= 3.0.5
,它应该匹配任何版本 >= 3.0.5
但是< 3.1.0
?
看起来我正在尝试实现 PEP 440 的版本说明符这里...
最佳答案
根据 the documentation packaging.version.parse
仅用于解析 PEP 440兼容的版本号,“3.0.*”
不是其中之一。通配符的使用在 PEP 中被称为在匹配时有效,但它们实际上并不是版本方案的一部分。
当为 packaging.version.parse
提供不兼容的版本号进行解析时,它会作为 packaging.version.LegacyVersion
而不是 packaging.version 返回.版本
。您可以确认这就是您的案例中被退回的内容。据推测,运算符(operator)对这些的工作方式不同(可能根本没有实现),并且他们在设置工具中实现了一些额外的逻辑来处理 LegacyVersion
对象。
关于Python 版本号与 != 比较(不等于),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67639128/