2009-10-22 38 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