Python 版本号与 != 比较(不等于)

标签 python versioning semantic-versioning

我正在尝试编写一个函数来复制 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.53.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/

相关文章:

python - Python中按住退格键删除多个字符

python - 导入错误:无法导入名称 'google'

versioning - 是否有推广候选版本的规范?

python - 如果输入长度 > 20,则生成不同消息的子类方法

python - 将方法参数转发给另一个方法 - self 需要从 locals() 中弹出

c# - 使用NEST的elasticsearch:文档版本控制

ruby-on-rails - Rails 中的对象版本控制,如 Papertrail,但单独的表

node.js - 为 npm install --save 指定 semver 运算符

java - 语义版本 : can new functionality be considered breaking change?

git - 如果Git Workflow具有增量版本控制功能,为什么我们需要语义版本控制?