百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python包版本表示趣谈(python所有版本)

itomcoil 2025-03-19 13:37 27 浏览

Python包版本表面上看起来很简单,但是同一般业界通用的定义良好的版本方案却不一样,有点诡异。比如正常的版本表示都为SemVer 1.2.3或CalVer 2023.6.1,有时候还有带预发布版本后缀的,比如1.2.3pre1。但是Python包版本控制可能会有些不一样,本文虫虫就给大家介绍一些python包的版本管理。

概述

由于 Python 版本的复杂性,本文应作为不将Python版本作为简单字符串处理的原因列表。而是使用官方packaging.version.Version类。该类可以解析、比较和推理Python版本

PEP440的Python包版本的当前最新的标准。基于PEP440的规定,目前绝大多数的Python包(大概97%软件包)都使用这种方式。

Python包版本由最6种类型的“版本部分”组成。其中一个是必需的“Release”部分和3个常见的可选部分,分别称为“Pre-releases”、“Post-releases”和“Dev”。 其余2个可选且不太常见的部分是“Epoch”和“Local”版本部分。下面的图表显示了版本部分的所有类型、它们的排序方式以及分隔符是什么:

v前缀

任何版本号都可以以v前缀可选的开头。该字符在规范化过程中会被剥离,并且不携带有关版本的任何进一步数据。

__version__ = "v1.0" # 规范化为 '1.0'

Epoch版本

Epoch版本即日期纪元为包提供了一种更改其版本控制方案的方法,而无需承担过去版本控制的负担影响哪个版本将被视为“最新”的方案。 例如,如果项目使用大量第一个发行版本段可能会很笨重,然后使用更大的数字来“摆脱”之前的版本控制方案。

根据PEP440:

特别是,支持版本纪元允许之前使用基于日期的版本控制的项目通过指定新版本纪元切换到语义版本控制。

Local版本

local 本地版本是由字母数字和句点组成的任意标识符,位于“release”之后。本地版本没有任何预定义的语义,但通常用于区分上游版本来自下游集成商可能改变的重建。

本地版本“段”可以通过以下方式分隔 ., -,或者_但所有这些字符都会规范化为.:

__version__ = "1.0.0+ubuntu-1" # 规范化为'1.0.0+ubuntu.1'

注意:本地版本也无法上传到PyPI,该服务将拒绝它们:


PEP 中明确指出了这种行为:

由于Python包索引仅用于索引和托管上游项目,因此它不得允许使用本地版本标识符。

版本长度

PEP 440没有定义版本号的最大长度,所以可以是任意长度。例如,有的包使用了pi的前217位作为其版本号。

大小写

版本号都会被规范化为小写:

__version__ = "V1.0.0-RC0" # 规范化为'1.0.0rc0'

Pre-post-dev发布

Pre、post和dev版本部分并不是唯一的,可以将所有三个版本合并为一个,比如:

__version__ = "1.0.0-pre0-post0-dev0"

分隔符

Pre、post和dev版本部分都有一个可选的分隔符(-, _,或者.),这些部分可以组合在一起,而无需任何字符将它们分开,可以拥有包含所有三个的版本:

__version__ = "0previewpostdev" # 规范化为0rc0.post0.dev0

和“rc“相似的”cr”也是一个有效的版本标识符,但是两者意思完全,因为c表示预发布,但是r表示发布后:

比如

__version__ = "1.0.0rc1"

__version__ = "1.0.0cr1" # 规范化为 '1.0.0.rc0.post1'

分隔符规范化

alpha、beta、候选版本后缀在没有分隔符的情况下进行规范化,但post和开发版本后缀则使用分隔符进行规范化:

__version__ = "1.0.0-alpha0" # --> 1.0.0a0
__version__ = "1.0.0-beta" # --> 1.0.0b0
__version__ = "1.0.0-rc0" # --> 1.0.0rc0
__version__ = "1.0.0post0" # --> 1.0.0.post0
__version__ = "1.0.0dev0" # --> 1.0.0.dev0

隐式post

有连字符分隔符“-”并且任何release版本后面的数字相当于post:

__version__ = "0-0" # 规范化为'0.post0'

隐式零

版本1.0和1.0.0表示不同的版本号。 Release部分会自动将缺少的版本段添加零,以便两者比较相同的值。

所以可以在版本后添加大量零, pip可以很好地自动处理它:

数值归一化

所有整数均通过int()内置意味着它们将规范化,去掉前缀零无,成无错误的整数:

__version__ = "01.001.0000" # 规范化'1.1.0'

PEP440之前版本的不明确解析

PEP 440 于2014年才生效,在此之前已经发布了很多Python包了,对版本的PEP440规则的追溯应用可能会导致源发行版出现一些不明确的解析情况。

Wheel编译版本

Wheel编译版本号是一个与版本号非常相似的功能,并且仅适用于Wheel发行版。 当两个包具有相同的名称、版本、平台、Python 和ABI标签时,这个版本号将用来区分比较两个版本。

从PEP 427开始,内部版本号位于Wheel文件名中的名称和版本之后:

{name}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl

所以可以拥有两个具有相同名称、版本和标签但仍不相同的发行版到Wheel版本号。除了锁定文件中的版本之外,固定哈希值也很重要的又一个原因。

综上,dist名称为0可以对应有一个名为 0-0-0-0-py3-any-none.whl的文件

0-0-0-0-py3-any-none.whl
^ ^ ^ ^
| | | |
| | | +- build number
| | +- post-release
| +- version
+- name

相关推荐

MySQL修改密码_mysql怎么改密码忘了怎么办

拥有原来的用户名账户的密码mysqladmin-uroot-ppassword"test123"Enterpassword:【输入原来的密码】忘记原来root密码第一...

数据库密码配置项都不加密?心也太大了吧!

先看一份典型的配置文件...省略...##配置MySQL数据库连接spring.datasource.driver-class-name=com.mysql.jdbc.Driverspr...

Linux基础知识_linux基础入门知识

系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...

MySQL密码重置_mysql密码重置教程

之前由于修改MySQL加密模式为mysql_native_password时操作失误,导致无法登陆MySQL数据库,后来摸索了一下,对MySQL数据库密码进行重置后顺利解决,步骤如下:1.先停止MyS...

Mysql8忘记密码/重置密码_mysql密码忘了怎么办?

Mysql8忘记密码/重置密码UBUNTU下Mysql8忘记密码/重置密码步骤如下:先说下大概步骤:修改配置文件,使得用空密码可以进入mysql。然后置当前root用户为空密码。再次修改配置文件,不能...

MySQL忘记密码怎么办?Windows环境下MySQL密码重置图文教程

有不少小白在使用Windows进行搭建主机的时候,安装了一些环境后,其中有MySQL设置后,然后不少马大哈忘记了MySQL的密码,导致在一些程序安装及配置的时候无法进行。这个时候怎么办呢?重置密码呗?...

10种常见的MySQL错误,你可中招?_mysql常见错误提示及解决方法

【51CTO.com快译】如果未能对MySQL8进行恰当的配置,您非但可能遇到无法顺利访问、或调用MySQL的窘境,而且还可能给真实的应用生产环境带来巨大的影响。本文列举了十种MySQL...

Mysql解压版安装过程_mysql解压版安装步骤

Mysql是目前软件开发中使用最多的关系型数据库,具体安装步骤如下:第一步:Mysql官网下载最新版(mysql解压版(mysql-5.7.17-winx64)),Mysql官方下载地址为:https...

MySQL Root密码重置指南:Windows新手友好教程

如果你忘记了MySQLroot密码,请按照以下简单步骤进行重置。你需要准备的工具:已安装的MySQL以管理员身份访问命令提示符一点复制粘贴的能力分步操作指南1.创建密码重置文件以管理员...

安卓手机基于python3搜索引擎_python调用安卓so库

环境:安卓手机手机品牌:vivox9s4G运行内存手机软件:utermux环境安装:1.java环境的安装2.redis环境的安装aptinstallredis3.elasticsearch环...

Python 包管理 3 - poetry_python community包

Poetry是一款现代化的Python依赖管理和打包工具。它通过一个pyproject.toml文件来统一管理你的项目依赖、配置和元数据,并用一个poetry.lock文件来锁定所有依赖的精...

Python web在线服务生产环境真实部署方案,可直接用

各位志同道合的朋友大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题最近经...

官方玩梗:Python 3.14(πthon)稳定版发布,正式支持自由线程

IT之家10月7日消息,当地时间10月7日,Python软件基金会宣布Python3.14.0正式发布,也就是用户期待已久的圆周率(约3.14)版本,再加上谐音梗可戏称为π...

第一篇:如何使用 uv 创建 Python 虚拟环境

想象一下,你有一个使用Python3.10的后端应用程序,系统全局安装了a2.1、b2.2和c2.3这些包。一切运行正常,直到你开始一个新项目,它也使用Python3.10,但需要...

我用 Python 写了个自动整理下载目录的工具

经常用电脑的一定会遇到这种情况:每天我们都在从浏览器、微信、钉钉里下各种文件,什么截图、合同、安装包、临时文档,全都堆在下载文件夹里。起初还想着“过两天再整理”,结果一放就是好几年。结果某天想找一个发...