Python如何实现支持通配符、兼容匹配的PEP440版本校验功能?
解决方案
不需要自行实现PEP 440版本规范匹配逻辑,packaging库已经提供了开箱即用的原生实现,packaging.specifiers.SpecifierSet类完全兼容python_requires的所有规则,也是setuptools、pip底层实际使用的版本匹配实现。
基础使用示例
无需手动拆分规则字符串,直接将完整规则传入即可自动处理通配符匹配、多规则逻辑合并:
from packaging.specifiers import SpecifierSet from packaging.version import Version # 定义版本规则 spec = SpecifierSet(">=2.6, !=3.0.*, !=3.1.*") # 判断版本是否匹配 print(Version("3.0.5") in spec) # 输出False,符合预期(3.0.5属于3.0.*范围,被排除) print(Version("2.7.18") in spec) # 输出True print(Version("3.2.0") in spec) # 输出True
兼容版本匹配(~=规则)
SpecifierSet原生支持~=兼容语法,无需手动拆分为上下限规则:
spec = SpecifierSet("~=3.0.5") print(Version("3.0.5") in spec) # 输出True print(Version("3.0.10") in spec) # 输出True print(Version("3.1.0") in spec) # 输出False,符合>=3.0.5且<3.1.0的要求
原错误做法原因说明
之前直接用version.parse解析带通配符的规则字符串是错误用法:version.parse仅用于解析具体的版本号,无法识别*通配符、~=兼容符等规则语法,所有版本约束的判断逻辑都应该交给SpecifierSet处理。
内容的提问来源于stack exchange,提问作者klamann
相关产品推荐
相关产品推荐

