我们正在设立新的分支机构,所有分支都将共享相同的库。
问题在于,如果我们更新一个库,您可能会破坏所有未更新的应用程序。
因此我们想对我们的图书馆进行编辑 我计划这样做的方式就像这样
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
答案 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
曾经有类似的东西。我现在找不到它,但这并不意味着它已经消失了。你可能想看看它。