Python模块在多个产品之间共享

时间:2010-05-12 23:20:57

标签: python module

我正在研究一个在两个产品之间共享的python类。 90%的功能适用于这两种产品。对于不同的10%,代码中充满了这种东西:

#Start of file
project = 'B'

#Some line of code

if project == 'A':
    import moduleA
elif project == 'B':
    import moduleB

#Many lines of code

if project == 'A':
    print moduleA.doA(2)
elif project == 'B':
    print moduleB.doB(2)

这似乎不是很优雅或非常易读,有没有人遇到过这种事情?有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

不,因为这是非常糟糕的设计。如果模块的行为受到使用它的项目的影响,那么它应该接受对象,函数或其他针对项目特定行为的回调。我的建议是分解共享的部分并将它们组成一个单独的模块,对于任何特定于项目的东西,添加对需要传入的对象的依赖,并要求该对象符合某个接口。然后,将项目特定的行为包装在符合所需接口的对象中,并将其传递给公共共享模块。

答案 1 :(得分:0)

您的共享模块应该实现一个基类,该基类具有使用模块共同的功能,然后每个使用模块将子类化该基类并添加或调整必要的内容。还有其他好方法(例如@ Michael的答案中的建议,称为依赖注入设计模式),但通常子类化和覆盖是为不同的特定需求“定制”功能的最简单方法(它确实导致高和刚性耦合,但这通常是可以接受的简单成本)。

答案 2 :(得分:0)

另一种可能的方法是,如果到目前为止给出的两个答案都不实用,那就是在导入级别定义接口。例如:

if project == 'A':
  from moduleA import doA as doproject
elif project == 'B':
  from moduleB import doB as doproject

# many lines of code

doproject(2)

这个概念(虽然不是这个特定的问题)是“将X导入Y”真的很有用的事情之一。

你也可以更聪明地根据项目名称构建导入,制作一个由项目键入的字典,该字典具有要调用的模块的值,以及那种东西。但是我不会去那个方向,除非我真的确定重构所以我可以通过我需要的模块无法工作。