2010-12-09 28 views
2

我有我们在我们的设施中使用的这个核心python模块,称为mfxLib。我需要能够保持此模块的不同版本,而不会打破导入此模块的所有其他模块/插件。如何维护一个python模块的不同版本?

我的解决办法是重新命名他们mfxLib01和mfxLib02然后 用只含一个__init__.py文件导入最新版本的空模块替换原来的mfxLib模块保持我的模块的重复。

# content of mfxLib.__init__.py 
from mfxLib02 import * 

这似乎合乎逻辑,似乎工作,但我想知道是否有这样做的一种常见做法?遵循的准则?等

感谢

+0

+1我喜欢你的`__init __。py`技术。 – martineau 2010-12-09 21:52:56

回答

4

您可以导入模块作为另一个名称。通常人们用它来保存长的模块名称输入,例如:

import numpy as np 
np.array([1,2,3,4]) 

因此,你可以这样做:

import mfxLib01 as mfxLib 

import mfxLib02 as mfxLib 

那么你的代码使用mfxLib无处不在。

这可能会帮助...

+0

这会工作,但需要对导入模块的所有其他模块和插件进行大量修改。我想尽可能保持透明,以便导入mfxLib将始终导入最新版本。 – 2010-12-09 20:45:25

0

如果你需要不同的版本不同的脚本,你目前的做法应该是最好的,但我建议使用版本控制系统如Git或SVN。这将允许您轻松提交并恢复到早期版本,并与其他用户共享该模块。

+0

谢谢,我已经使用git进行版本控制。我希望网络上有多个版本的模块,以便插件可以加载v01,而其他插件使用v02。 – 2010-12-09 20:46:55

0

版本控制几乎肯定会让你的生活更轻松。除了Petterson的建议,请考虑Mercurial。像git和SVN一样,它是免费的。它也是用Python编写的,应该可以在任何系统上毫无困难地运行。

Spacedman的建议也很有用,特别是如果版本之间的差异表示特定系统的自定义并且定制相对稳定。请注意,您可以将此方法与版本控制系统结合使用。

最后,总是有必要努力编写你的模块,以便它可以在任何地方无需修改就能正常工作。通常,您可以通过向几个关键功能添加一些可选参数来处理不同要求来实现此目的。 Python在这方面非常方便,因为arg列表末尾的关键字参数始终是可选的,所以您可以通过给它们提供合适的默认值来轻松地安排提供现有行为。

def foo(oldarg1, oldarg2, newarg1=None): 
    if newarg1 != None: 
     ## behave differently 
    else: 
     ## behave as usual