首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算版本号之间的差额

问计算版本号之间的差额
EN

Stack Overflow用户
提问于 2015-12-18 09:21:21
回答 4查看 734关注 0票数 2

this question的答案帮助我比较了两个版本号字符串,看哪个版本“更大”,也就是更新的版本。

我现在需要做的是计算两个版本号之间的实际差异。主要是为了看看新的主要版本是否已经发布,或者仅仅是一个次要版本。

"1.3.6" - "1.3.3"应该返回"0.0.3"

"5.2.0" - "4.0.0"应该返回"1.2.0"

我可以自己编写一个函数来计算差异(理论上很容易),但是如果包含pkg_resources已经考虑过的所有情况,比如版本号之间的字母或版本号末尾的字母,那就麻烦了。

我看过pkg_resources的纪录片,但简单的减法似乎行不通。对于这个问题,还有其他已经实现的解决方案吗?

编辑:,好吧,简单的减法没有多大意义,现在我已经考虑过了。它将稀释主要版本和次要版本之间的边界(例如"2.1“- "1.2”= "0.9“,这一点都没有帮助)。(谢谢@杰里米班克斯)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-18 09:39:31

你可以一个一个地比较每个部分:

代码语言:javascript
复制
def compare(a, b):
    a_parts = a.split('.')
    b_parts = b.split('.')
    v = ['major', 'minor', 'build']
    for i in range(3):
        diff = int(a_parts[i]) - int(b_parts[i])
        if diff is 0:
            continue
        if diff > 0:
            direction = 'ahead'
        else:
            direction = 'behind'
            diff = -diff

        return 'pkg is %s %s version %s' %  (diff, v[i], direction)
    return 'version are equal'

print compare('3.2.1', '2.0.0') # pkg is 1 major version ahead
print compare('3.2.1', '3.0.0') # pkg is 2 minor version ahead
print compare('3.2.1', '3.2.0') # pkg is 1 build version ahead
print compare('3.2.1', '3.2.1') # version are equal
print compare('3.2.1', '6.2.1') # pkg is 3 major version behind

如果您的版本号不是标准的(即:1.2b.4321),您可以使用像parse_version这样的工具进行准备。

票数 1
EN

Stack Overflow用户

发布于 2015-12-18 09:43:48

下面是我刚刚写的一个函数,它做了一些类似于这样的事情:

代码语言:javascript
复制
def diffver(v1, v2):
    v1s = map(int, v1.split('.'))
    v2s = map(int, v2.split('.'))

    for ii, (v1r, v2r) in enumerate(zip(v1s, v2s), 1):
        if v1r != v2r:
            return ii, v1r - v2r

    return ii, 0

print diffver("4.0.0", "5.2.0")
print diffver("5.1.0", "5.2.0")
print diffver("5.4.0", "5.2.0")
print diffver("5.4.0", "5.4.0")

它打印:

代码语言:javascript
复制
(1, -1)
(2, -1)
(2, 2)
(3, 0)

这个想法是返回一个元组(部分,差异),其中部分是1的大调,2的小调,等等,而差异是有多大的不同。没有区别,给你的部分是有多少部分被比较。

票数 2
EN

Stack Overflow用户

发布于 2015-12-18 09:36:54

好的,谢谢你到目前为止的评论,我现在看到,比较版本号作为一个整体是没有意义的。

只有比较整个版本号的“片段”才有意义,即只比较第一部分或第二部分。这就是我可能会做的。

更具体地说:我将首先看看主要版本(第一部分)是否存在差异。如果是这样的话,次要版本就无所谓了。如果不是这样的话,我将继续比较版本号的下一部分。

如果包含版本号包含字母(如"1.8.4b")的情况,这个解决方案仍然会让人感到烦恼,但我想这是无法避免的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34352196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档