【问题标题】:Creating versioned libraries in python在 python 中创建版本库
【发布时间】:2011-11-08 14:56:35
【问题描述】:

我们正在工作中建立新的分支,它们都将共享相同的库。

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

因此,我们希望对我们的库进行版本控制。
我打算这样做的方式是这样的

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

或者可能是这样的:

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

问题是这个加载器将如何工作。
天真的方法是将每个版本都放在自己的文件夹中,但是这样做的问题是,如果所有版本都存在共同的错误,则每个版本都需要单独修复。

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

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

python 中是否有类似的内置方法或任何其他可行的方法?

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


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

【问题讨论】:

    标签: python versioning


    【解决方案1】:

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

    import package.modv2
    import package.modv3
    

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

    也可以在功能层面做,尽量减少文件的数量:

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

    【讨论】:

    • 两个模块可以在同一个文件里吗?
    • 不完全是……两个模块的内容可能是。
    • 很好,那我们可以from package.module import functionv2 as function
    【解决方案2】:

    我相信这就是 virtualenv 的设计初衷。来自virtualenv website

    virtualenv 是一个创建隔离 Python 环境的工具。

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

    在[这种情况下],virtualenv 可以帮助你。它创造了一个环境 有自己的安装目录,不共享 具有其他 virtualenv 环境的库(并且可选地不 也可以访问全局安装的库)。

    【讨论】:

    • 不是我们真正想要的,我们想在运行时选择。
    【解决方案3】:

    我知道setuptools 曾经有过这样的事情。我现在找不到它,但这并不意味着它已经消失了。你可能想调查一下。

    【讨论】:

    • 你可能在想entry points
    • 不,setuptools 曾经有办法说“导入此特定版本的库 foo”。与入口点非常不同。
    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多