在Python中创建版本库

7 投票
3 回答
1099 浏览
提问于 2025-04-17 01:08

我们在公司里正在设置新的分支,这些分支都会共享相同的库。

问题是,如果我们更新了某个库,可能会导致那些没有更新的应用程序出现问题。

所以我们想给我们的库加上版本号。
我打算这样做:

loader.load(name='mylib', version='1.0')

或者也可以这样:

import mylib
mylib.load(version='1.0')

问题是这个加载器是怎么工作的。
最简单的方法是把每个版本放在自己的文件夹里,但这样的问题是,如果所有版本都有一个共同的bug,那每个版本都得单独修复。

一个稍微好一点的方法(为了维护方便)是把所有版本的库放在同一个文件里,然后调用一个加载函数来创建指向这些函数的链接。
我不确定这样做会不会很美观(可能会变成几千行的庞大文件,当然我们可以删除旧的、不再使用的版本)。

为了减少版本的数量,我打算只有在破坏兼容性的时候才增加版本号,而不是在修复bug或添加新功能的时候。

Python里有没有类似的内置功能,或者有什么其他的解决方案可以用?

有没有人有这方面的经验?


我可以补充一下,使用这些库的是测试用例,我们只希望测试人员进入分支后运行 ./testit.py,其他的都不需要。


解决方案

这个解决方案是基于Gringo Suave的建议。

class MyClass_1_0:
    def func1(self):
        return 'Baz'

    def func2(self):
        return 'Bar'

class MyClass_1_1(MyClass_1_0):
    # Overwriting a function:
    def func1(self):
        return 'Foo'

    # Definining a new function which uses a function
    # from a previous version:
    def func3(self):
        print("{} {}".format(self.func1(), self.func2()))

# Change this to the latest version for stuff that always wants the latest
class MyClass(MyClass_1_1): pass

示例用法:

>>> from my.module import MyClass_1_1 as MyClass
>>> m = MyClass()
>>> m.func3()
Foo Bar

3 个回答

1

我知道以前 setuptools 有类似的功能。虽然我现在找不到,但这并不意味着它已经消失了。你可以去查查看。

2

我觉得这就是virtualenv的目的所在。从virtualenv的网站上可以看到:

virtualenv是一个用来创建独立Python环境的工具。

它解决的主要问题是依赖关系和版本问题,还有间接的权限问题。想象一下,你有一个应用需要LibFoo的1.0版本,但另一个应用却需要2.0版本。那你该如何同时使用这两个应用呢?

在这种情况下,virtualenv可以帮你。它会创建一个独立的环境,里面有自己的安装目录,不会和其他virtualenv环境共享库文件(而且你还可以选择不使用全局安装的库)。

3

通常,这种做法是通过增加模块名称的数字来实现的。你可以设计一个更复杂的方法,但这个方法是最简单易懂和容易实现的。

import package.modv2
import package.modv3

每次API(应用程序接口)发生变化时,就创建一个新的模块版本。

也可以在函数级别进行更改,这样可以减少文件的数量:

from package.module import functionv2
from package.module import functionv3

撰写回答