微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 版本号与 != 比较不相等

如何解决Python 版本号与 != 比较不相等

我正在尝试编写一个setup.py 复制 python_requires 行为的函数,因为我未能在 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.53.0.* 相同),但版本 3.0.5 实际上应该匹配 3.0.*。 Python 中是否有标准方法来检查带有通配符的版本号是否与另一个版本号匹配?

edit:同样相关,我将如何实现兼容的版本匹配器,例如 ~= 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.Version 返回。您可以确认这是您的案例中返回的内容。推测这些操作符的工作方式不同(可能根本没有实现),并且他们在设置工具中实现了一些额外的逻辑来处理 LegacyVersion 对象。

,

如果您的最终目标只是将版本兼容性与 PEP 440 版本说明符进行比较,那么 packaging.specifiers 似乎已经支持这一点:

>>> from packaging.specifiers import SpecifierSet
>>> vspec = SpecifierSet(">=11.3,!=11.3.2")
>>> "11.3.1" in vspec
True
>>> "11.3.2" in vspec
False
>>> 

specifiers.py source 如果您真的要自己实现,可能会有所帮助。看起来一般的方法是正则表达式匹配每个运算符,将它们映射到适当的 Specifier 方法,其中在任何特殊处理(例如,Version 处理“.*”你问的情况)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。