#版本 #指定符 #数字 #绑定 #要求 # #pep-440

pep440_rs

一个用于 Python 版本号和指定符的库,实现了 PEP 440

19 个不稳定版本 (3 个破坏性版本)

0.6.6 2024 年 7 月 30 日
0.6.0 2024 年 4 月 9 日
0.5.0 2024 年 2 月 18 日
0.4.0 2023 年 12 月 11 日
0.3.2 2023 年 3 月 31 日

#124 in 解析器实现

Download history 13081/week @ 2024-05-04 14613/week @ 2024-05-11 13109/week @ 2024-05-18 13002/week @ 2024-05-25 15521/week @ 2024-06-01 12021/week @ 2024-06-08 12391/week @ 2024-06-15 16327/week @ 2024-06-22 12856/week @ 2024-06-29 12770/week @ 2024-07-06 15586/week @ 2024-07-13 18318/week @ 2024-07-20 20110/week @ 2024-07-27 19672/week @ 2024-08-03 22003/week @ 2024-08-10 23164/week @ 2024-08-17

87,572 每月下载量
用于 9 个软件包 (7 个直接使用)

Apache-2.0 OR BSD-2-Clause

190KB
4K SLoC

PEP440 在 rust 中

Crates.io PyPI

一个用于 Python 版本号和指定符的库,实现了 PEP 440。有关背景信息,请参阅 重实现 PEP 440

pep508_rs 中提供了对要求语法的更高层绑定。

use std::str::FromStr;
use pep440_rs::{parse_version_specifiers, Version, VersionSpecifier};

let version = Version::from_str("1.19").unwrap();
let version_specifier = VersionSpecifier::from_str("==1.*").unwrap();
assert!(version_specifier.contains(&version));
let version_specifiers = parse_version_specifiers(">=1.16, <2.0").unwrap();
assert!(version_specifiers.contains(&version));

在 python 中 (pip install pep440_rs)

from pep440_rs import Version, VersionSpecifier

assert Version("1.1a1").any_prerelease()
assert Version("1.1.dev2").any_prerelease()
assert not Version("1.1").any_prerelease()
assert VersionSpecifier(">=1.0").contains(Version("1.1a1"))
assert not VersionSpecifier(">=1.1").contains(Version("1.1a1"))
# Note that python comparisons are the version ordering, not the version specifiers operators
assert Version("1.1") >= Version("1.1a1")
assert Version("2.0") in VersionSpecifier("==2")

PEP 440 有很多不直观的特性,包括

  • 一个纪元,可以加在版本号前,例如 1!1.2.3。较低的纪元总是意味着较低的版本 (1.0 <=2!0.1)
  • 后版本,可以附加到稳定发布版和预发布版上
  • 开发版本,可以附加到 sbpth 表发布版和预发布版上。当附加到预发布版时,开发版本排在正常预发布版之下,然而当附加到稳定版本时,开发版本排在预发布版之前
  • 预发布处理很混乱:“所有类型的预发布,包括开发发布,默认情况下都不包括在任何版本指定符中,除非它们已经在系统中存在,或用户明确请求,或者唯一满足版本指定符的版本是预发布版本。”这意味着我们不能说指定符是否匹配,而不同时查看环境
  • 预发布与预发布 incl. 开发版本模糊不清
  • 在所有其他版本之上的是本地版本,它们带有加号,并具有隐式类型的字符串和数字段
  • 没有 semver-caret (^),而是一个伪 semver 波浪号 (~=)
  • 排序与匹配冲突:例如,在排序时我们有 1.0+local > 1.0,但 ==1.0 匹配 1.0+local。虽然版本的排序本身是一个全序,但版本匹配需要处理各种特殊情况

依赖关系

~0.4–1.6MB
~25K SLoC