2013-08-20 60 views
0

我想根據某些條件在我的類中動態地導入模塊。根據條件使用Python模塊

class Test(object): 
     def __init__ (self,condition): 
      if condition: 
       import module1 as mymodule 
      else: 
       import module2 as mymodule 

      self.mymodule = mymodule 

     def doTest(self): 
      self.mymodule.doMyTest 

其中module1和module2以不同方式實現doMyTest。

調用它作爲

mytest1 = Test(true) # Use module1 
    mytest2.doTest() 

    mytest2 = Test(false) # Use module2 
    mytest2.doTest() 

這工作,但有可能是一個更地道的方式?有沒有可能的問題?

+0

其實,這並沒有真正的工作_quite_以及你認爲它......但這是關於進口報表在全球和本地做什麼,並且與條件無關。 – abarnert

+0

有*可能*是一種更習慣的方式,取決於你正在檢查的條件的實際性質。你想解決什麼問題? – SingleNegationElimination

+0

我正在嘗試開發一個測試套件,其中測試方法的實際實現可能會有所不同,具體取決於測試對象所屬的類別。 – peterk

回答

1

當然通常你不想在__init__方法的中間導入模塊,但是測試類是該規則的一個明顯的例外,所以讓我們忽略這個部分,並想象你在頂層做這件事:

if test_c_implementation: 
    import c_mymodule as mymodule 
else: 
    import py_mymodule as mymodule 

這完全是慣用的。事實上,你會在stdlib中看到類似的代碼,以及由核心開發人員編寫的其他代碼。

除非在非常常見EAFP案件,那裏的條件只是爲了避免異常,在這種情況下,它更地道,只是這樣做:

try: 
    import lxml.etree as ET 
except ImportError: 
    import xml.etree.cElementTree as ET 
+0

謝謝。在我的情況下,導入可以放在其他Test方法中,而不是__init__。我更感興趣的是,將模塊引用作爲Test屬性傳遞是一種有效的Python技術。 – peterk

+0

@peterk:關於'__init__'與_any_方法無關。關鍵是:這是一件很奇怪的事情;唯一明顯的用處就是在測試庫中......這正是你正在寫的東西,所以沒關係,這很奇怪。 – abarnert

+0

@peterk:無論如何,一個模塊是第一類值,就像其他任何名稱空間一樣,所以它肯定是_valid_來傳遞一個,將它作爲一個屬性存儲等。大多數模塊並不是真的被設計成_thought_作爲值,但肯定有合理的例外(即使在stdlib中,「隨機」也具有與random.Random實例完全相同的API),並且再次,測試庫可能很容易想到模塊作爲一個值,即使模塊的普通用戶不會。 – abarnert