在python中创建版本化库

时间:2011-09-01 18:00:44

标签: python versioning

我们正在设立新的分支机构,所有分支都将共享相同的库。

问题在于,如果我们更新一个库,您可能会破坏所有未更新的应用程序。

因此我们想对我们的图书馆进行编辑 我计划这样做的方式就像这样

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

或者可能是这样的:

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

问题是这个装载机如何工作 天真的方法是将每个版本放在他们自己的文件夹中,但问题是,如果所有版本中都存在常见错误,则每个版本都需要单独修复。

稍微好一点的方法(可维护性)是将库的所有版本都放在同一个文件中,并调用一些load函数来创建函数链接。 我不知道这会有多漂亮(我们最终会得到几千行的怪物文件,我们当然可以删除旧的,未使用的版本)。

为了帮助减少版本数量,我打算只在我破坏兼容性时增加版本号,而不是修复错误或添加新内容。

有没有这样的内置到python或任何其他方法可以工作?

有没有人有这种东西的经验?


我可以补充一点,使用lib的东西都是测试用例,我们只是希望测试人员进入分支并运行./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 个答案:

答案 0 :(得分:3)

通常,这样做的方法是增加模块名称。您可以设计一种更健壮的方法,但这是最容易理解/实现的方法。

import package.modv2
import package.modv3

每次API更改时创建新的模块版本。

也可以在功能级别完成,以最大限度地减少文件数量:

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

答案 1 :(得分:2)

我相信这是virtualenv的目的。来自virtualenv website

  

virtualenv是一个创建孤立的Python环境的工具。

     

正在解决的基本问题是依赖关系和版本之一,   和间接权限。想象一下,你有一个需要的应用程序   LibFoo的第1版,但另一个应用程序需要版本2.如何   你可以同时使用这两个应用程序吗?

     

在[本案例]中,virtualenv可以帮到你。它创造了一个环境   它有自己的安装目录,不共享   具有其他virtualenv环境的库(并且可选地不具有   访问全局安装的库)。

答案 2 :(得分:1)

我知道setuptools曾经有类似的东西。我现在找不到它,但这并不意味着它已经消失了。你可能想看看它。