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“,这一点都没有帮助)。(谢谢@杰里米班克斯)
发布于 2015-12-18 09:39:31
你可以一个一个地比较每个部分:
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这样的工具进行准备。
发布于 2015-12-18 09:43:48
下面是我刚刚写的一个函数,它做了一些类似于这样的事情:
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")它打印:
(1, -1)
(2, -1)
(2, 2)
(3, 0)这个想法是返回一个元组(部分,差异),其中部分是1的大调,2的小调,等等,而差异是有多大的不同。没有区别,给你的部分是有多少部分被比较。
发布于 2015-12-18 09:36:54
好的,谢谢你到目前为止的评论,我现在看到,比较版本号作为一个整体是没有意义的。
只有比较整个版本号的“片段”才有意义,即只比较第一部分或第二部分。这就是我可能会做的。
更具体地说:我将首先看看主要版本(第一部分)是否存在差异。如果是这样的话,次要版本就无所谓了。如果不是这样的话,我将继续比较版本号的下一部分。
如果包含版本号包含字母(如"1.8.4b")的情况,这个解决方案仍然会让人感到烦恼,但我想这是无法避免的。
https://stackoverflow.com/questions/34352196
复制相似问题