Python中增加版本号

3

我正在尝试在CVS文件中进行版本号更新。

我的初始逻辑是更新一个浮点数(1.1 --> 1.2 --> 1.3),这个方法可以很好地工作,直到我更新到1.9,然后它会更新为2.0。

我正在尝试使用这种方法更新到1.10,但是当我尝试增加1.x中的x时(ver[1] += 1),它会报错。

def replace_string():
    with open(filename) as f:
        found = False
    #for line in fileinput.input(filename, inplace=1):
        for line in f:
            if re.search("CVS Header", line):
                print 'Old Line \n' + line

                ####################################################################################
                #  Below logic:                                                                    #
                #  if length of revision number is 4 characters (e.g. 1.15) then increment by 0.01 #
                #  else if it is 3 characters (e.g. 1.5) then increment by 0.1                     #
                ####################################################################################

                if len(line.split("$Revision: ")[1].split()[0]) == 4:
                    ver = line.split("$Revision: ")[1].split()[0]
                    ver = [int(x) for x in ver.split('.')]
                    ver = '{0[0]}.{0[1]}'.format(ver)
                    ver[1] += 1
                    print ver
                    new_line = str.replace(line, line.split("$Revision: ")[1].split()[0], ver)
                    print new_line

                elif len(line.split("$Revision: ")[1].split()[0]) == 3:
                    ver = line.split("$Revision: ")[1].split()[0]
                    ver = [int(x) for x in ver.split('.')]
                    ver = '{0[0]}.{0[1]}'.format(ver)
                    ver[1] += 1
                    print ver
                    new_line = str.replace(line, line.split("$Revision: ")[1].split()[0], ver)
            ###
                newer_line = str.replace(new_line, line.split("$Author: ")[1].split()[0], username)
                newest_line = str.replace(newer_line, line.split("$Date: ")[1].split()[0], today)
                current_line = str.replace(newest_line, line.split("$Date: ")[1].split()[1], time)
                found = True
                print 'New Line \n' + current_line

    if not found:
        print "No CVS Header exists in %s" % filename  

if __name__ == "__main__":
    #args = parser.parse_args()
    replace_string()

堆栈跟踪,行号? - bereal
追踪(Traceback)最近的调用如下: 文件 "git.py",第78行,在<module>中: replace_string() 文件 "git.py",第58行,在replace_string中: ver[1] += 1 TypeError: 无法将'str'和'int'对象连接起来 - Andrew Hummel
即使您成功克服了int-str转换部分,字符串仍然是不可变的。 - bereal
1个回答

7

您可以使用以下内容:

ver, rev = str(1.9).split('.')
ver + '.' + str(int(rev)+1)  # result: '1.10'

通过这种方式,只要输入始终为字符串,就可以摆脱检查数字数量的麻烦。在我的例子中,输入不是字符串,所以我将1.9转换为字符串,但如果应用于浮点数1.10而不是字符串'1.10',则会失败。但你不必担心这个问题,因为你的输入

line.split("$Revision: ")[1].split()[0]

这已经是一个字符串了。


1
@user3495404,如果您想从一个函数中返回多个值,请使用以下方法开始。 - Charles Duffy
1
当操作(例如函数)的结果是序列(如元组或列表)时,您可以随时使用它。请查看我现在添加的教程链接。 - Oliver W.
1
为避免与其他版本号冲突,您可以考虑使用以下代码:ver, rev = '1.9'.split('.', 3)[:2]。这样您也可以处理 '1.9.3''1.3.9.15' 等版本号。在此代码中,数字 3 表示最多分割出的项目数,但由于我们最终只取前两个项目,因此它是可选的,但可以略微提高性能。 - Charles Duffy
2
请注意,如果您总是想要仅增加版本字符串的最后一个组件,而不是始终增加次要版本并删除其后的任何内容,则需要使用不同的算法(并且rsplit('。',2)将非常有用),但这需要更完整的规范以确定所需的行为。 - Charles Duffy
1
@CharlesDuffy,建议的改进是真实和正确的。但是正如您所提到的,给定的解决方案将取决于对所需行为的良好规范。 - Oliver W.
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接