我正在尝试创建一个python代码,它可以帮助将下面的版本值增加1,预期输出显示结果?我正在考虑拆分版本保存每个数字,将最后一个数字递增1并重新构建版本,是否存在简单地在python中的一种方式?
version1 = 1151.1
version2 = 4.1.1
version3 = 275.1.2.99
version4 = 379
next_version1 = version1 + 1
print next_version1
next_version2 = version2 + 1
print next_version2
next_version3 = version3 + 1
print next_version3
next_version4 = version4 + 1
print next_version4
预期产量: -
1151.2
4.1.2
275.1.2.100
380
实际上,在这种情况下并非所有数字都是浮点数。
您应该将其视为字符串并更新最后一个元素。
version1 = '275.1.2.3'
version2 = '279'
version3 = '275.2.3.10'
def updateVersion(version):
if '.' in version:
version = version.split('.')
version[-1] = str(int(version[-1]) + 1)
version = '.'.join(version)
else:
version = str(int(version)+1)
return version
updateVersion(version1)
updateVersion(version2)
输出:
275.1.2.4
280
275.2.3.11
首先请阅读有关Floating Point Arithmetic: Issues and Limitations的信息
也许这就是你问的原因,不清楚。
但是,我建议将每个部分保存为整数,例如
main_version_number = 1151
minor_version_number = 1
sub_version_number = 0
您可以使用适当的方法获得具有这些字段的数据结构(可能是Version
类吗?)。
不要依赖浮点运算。
首先,您概述的代码肯定会给出语法错误。许多形式2
是一个整数; 2.2
,一个浮点;但是2.2.2
,毫无意义。
你在这里寻找元组。例如,>>> version3 = (275,1,2,3)
然后你会得到
>>> version3
(275, 1, 2, 3)
要脏 - 只更新这样一个元组的最后一位,你可以这样做
>>> version3 = version3[:-1] + (version3[-1] + 1,)
>>> version3
(275, 1, 2, 4)
我之所以称之为脏更新的原因是它不会继续进入下一个重要位。
这是一个相对简单的脚本,可以在几分钟内完成。假设您已将版本号存储为名为version
的元组对象,请尝试以下操作:
new_version = version
for bit in range(len(version)):
new_version = new_version[:-1-bit] + ((new_version[-1-bit] + 1) % 10,) + new_version[-bit:]
if -2-bit >=0:
new_version = new_version[-2-bit:] + (new_version[-2-bit] + (version[-2-bit] + 1) // 10,) + new_version[-1-bit:]
elif (version[-2-bit] + 1) // 10:
new_version = (1,) + new_version
或者,看看bumpversion,这个工具可以让你通过git集成来处理项目中的版本编号。
变量'version2'和'version3'将导致语法错误。这种语法错误是由于Python不知道任何(数字)类型在其值中有多个点的事实引起的。从本质上讲,您试图以不打算使用的方式使用某些类型。更具体地说,浮点数不适合您的目标。顾名思义,浮点数只包含一个点,该点可以放在其数字之间的任何位置(浮动)。
我的建议是创建自己的类型/类。这将使您能够以允许轻松修改其值并更好地分离代码中的关注点的方式存储版本号(即,代码的每个部分仅涉及一件事)。
例
class VersionNumber:
"""Represents a version number that can contain parts (major, minor, etc)."""
def __init__(self, *argv):
"""This is the constructor, i.e. a function that is called when you create a new VersionNumber.
The '*argv' allows the user of this class to give a variable amount of arguments. This is why
you can have a version number with only 1 number, and one with 4. The '*argv' is iterable."""
#Create a class specific field, that stores all the version number parts in a list.
self.Parts = []
#Fill it with the supplied arguments.
for part in argv:
self.Parts.append(part)
def __repr__(self):
"""This function is called when the VersionNumber needs to be displayed in the console"""
return str(self)
def __str__(self):
"""This function is called when the VersionNumber is parsed to a string"""
return '.'.join(map(str,self.Parts))
def incrementVersion(self, position, incrementAmount):
"""This function allows you to increment the version number. It does this by adjusting the list
we have set in the constructor."""
self.Parts[position] += incrementAmount
version1 = VersionNumber(1, 23, 45, 0)
print(version1)
#Position -1, takes the last (most right) version number part from the version number.
version1.incrementVersion(-1, 1)
print(version1)
version2 = VersionNumber(346)
print(version2)
version2.incrementVersion(-1, 2)
print(version2)