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

Python包版本表示趣谈(python语言的版本)

off999 2025-07-10 19:56 4 浏览 0 评论

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

相关推荐

推荐一款Python的GUI可视化工具(python 可视化工具)

在Python基础语法学习完成后,进一步开发应用界面时,就需要涉及到GUI了,GUI全称是图形用户界面(GraphicalUserInterface,又称图形用户接口),采用图形方式显示的计算机操...

教你用Python绘制谷歌浏览器的3种图标

前两天在浏览matplotlib官方网站时,笔者无意中看到一个挺有意思的图片,就是用matplotlib制作的火狐浏览器的logo,也就是下面这个东东(网页地址是https://matplotlib....

小白学Python笔记:第二章 Python安装

Windows操作系统的python安装:Python提供Windows、Linux/UNIX、macOS及其他操作系统的安装包版本,结合自己的使用情况,此处仅记录windows操作系统的python...

Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字

Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字一、项目功能利用Tkinter组件中的Canvas绘制图形和文字。二、项目分析要在窗体中绘制图形和文字,需先导入Tkinter组...

一文吃透Python虚拟环境(python虚拟环境安装和配置)

摘要在Python开发中,虚拟环境是一种重要的工具,用于隔离不同项目的依赖关系和环境配置。本文将基于windows平台介绍四种常用的Python虚拟环境创建工具:venv、virtualenv、pip...

小白也可以玩的Python爬虫库,收藏一下

最近,微软开源了一个项目叫「playwright-python」,作为一个兴起项目,出现后受到了大家热烈的欢迎,那它到底是什么样的存在呢?今天为你介绍一下这个传说中的小白神器。Playwright是...

python环境安装+配置教程(python安装后怎么配置环境变量)

安装python双击以下软件:弹出一下窗口需选择一些特定的选项默认选项不需要更改,点击next勾选以上选项,点击install进度条安装完毕即可。到以下界面,证明安装成功。接下来安装库文件返回电脑桌面...

colorama,一个超好用的 Python 库!

大家好,今天为大家分享一个超好用的Python库-colorama。Github地址:https://github.com/tartley/coloramaPythoncolorama库是一...

python制作仪表盘图(python绘制仪表盘)

今天教大家用pyecharts画仪表盘仪表盘(Gauge)是一种拟物化的图表,刻度表示度量,指针表示维度,指针角度表示数值。仪表盘图表就像汽车的速度表一样,有一个圆形的表盘及相应的刻度,有一个指针...

总结90条写Python程序的建议(python写作)

  1.首先  建议1、理解Pythonic概念—-详见Python中的《Python之禅》  建议2、编写Pythonic代码  (1)避免不规范代码,比如只用大小写区分变量、使用容易...

[oeasy]python0137_相加运算_python之禅_import_this_显式转化

变量类型相加运算回忆上次内容上次讲了是从键盘输入变量input函数可以有提示字符串需要有具体的变量接收输入的字符串输入单个变量没有问题但是输入两个变量之后一相加就非常离谱添加图片注释,不超过1...

Python入门学习记录之一:变量(python中变量的规则)

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

掌握Python的"魔法":特殊方法与属性完全指南

在Python的世界里,以双下划线开头和结尾的"魔法成员"(如__init__、__str__)是面向对象编程的核心。它们赋予开发者定制类行为的超能力,让自定义对象像内置类型一样优雅工...

11个Python技巧 不Pythonic 实用大于纯粹

虽然Python有一套强大的设计哲学(体现在“Python之禅”中),但总有一些情况需要我们“打破规则”来解决特定问题。这触及了Python哲学中一个非常核心的理念:“实用主义胜于纯粹主义”...

Python 从入门到精通 第三课 诗意的Python之禅

导言:Python之禅,英文名是TheZenOfPython。最早由TimPeters在Python邮件列表中发表,它包含了影响Python编程语言设计的20条软件编写原则。它作为复活节彩蛋...

取消回复欢迎 发表评论: