2009-10-22 41 views
2

假设我有两个不同的模块,它们具有统一的(相同的)接口。文件列表如下:加载不同的模块而不改变逻辑文件

root/ 
    logic.py 
    sns_api/ 
     __init__.py 
     facebook/ 
      pyfacebook.py 
      __init__.py 
     myspace/ 
      pymyspace.py 
      __init__.py 

而且pyfacebook.py和pymyspace.py具有相同的接口,这意味着:

# in pyfacebook.py 
class Facebook: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

# in pymyspace.py 
class Myspace: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

现在我有一个问题。我想要做的logic.py逻辑而非复制代码,所以我不知道我怎么可以只设置一个标志,以显示我使用的模块和Python会自动加载正确的代码,这意味着:

# in logic.py 

PLATFORM = "facebook" 

# import the right modules in, complete the logic with the current platform 
# create the right instance and invoke the right methods 

然后我改变PLATFORM ='myspace',逻辑会自动工作。

那么我该如何做到这一点?

我想知道是否使用动态导入将工作,或评估原始python代码,但似乎不是一个好的解决方案。或者如果我可以制作一个统一的包装

sns_api/__init__.py 

任何人都可以帮忙吗?

回答

6

只有两个我会做

​​

,并使用Platform在代码的其余部分。这是在库中完成的,请参阅os模块。

您可以使用name =__import__('module')确实进行动态导入,但您可能不需要此功能。

0

在每个模块中都有一个“工厂”功能,进行动态导入并为加载的模块调用工厂。至少,这是一种方法。记住,Python的方式是“鸭打字”,让工厂返回一个对象,并在客户端使用它通过“鸭叫” :-)

0

您还可以使用EXEC:

exec "from sns_api.%s import Platform" % PLATFORM 

然后在您的实现文件,分配的东西平台:

# in pyfacebook.py 
class Facebook: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

Platform = Facebook