2015-05-22 77 views
1

當進口動態引發異常我有一個包,像這樣的結構:的Python:丟失的依賴

foo/ 
    __init__.py 
    bar1.py 
    bar2.py 

bar1bar2上課Bar1Bar2。我在__init__.py插入進口類爲了讓

from foo import Bar1 

,而不需要編寫

from foo.bar1 import Bar1 

好吧,這是工作的罰款,現在到了棘手的部分。當一些依賴丟失

所以我__init__.py是這樣

try: 
    from .bar1 import Bar1 
except MissingDependency: 
    pass 

try: 
    from .bar2 import Bar2 
except MissingDependency: 
    pass 

這意味着foo作品的進口,但它不會導入Bar1實施進口

bar1bar2可引發異常MissingDependencyBar2

import foo 

現在,我想要做的是當您嘗試導入Bar1並且失敗時,提升MissingDependency

目前發生的事情是

from foo import Bar1 
... 
ImportError: cannot import name Bar1 

我希望它提高MissingDependency

from foo import Bar1 
... 
MissingDependency: "Cannot import Bar1" 

編輯:我糾正一些錯誤搭配套餐名稱

+0

正好趕上一個' ImportError'並在'except'塊中引發你自己的異常? –

+0

所以要清楚,你想提出'進口包'沒有例外? '從包導入*'怎麼樣? –

+0

我希望能夠做'import foo'。如果我抓到'ImportError'並引發我自己的異常,它也會導致'import foo'失敗。我希望它只在'from foo import Bar1'上失敗 – svituz

回答

0

我不是100%肯定,爲什麼你會這樣,但你可以提出一個不同的例外:

try: 
    from package import Mod1 
except ImportError: 
    raise MissingDependency("Cannot import Mod1") 
+0

以這種方式,它也會導致'富' – svituz

+0

???您可以明確地將其導入其他地方...我正在努力查看問題在這裏。 'foo'將如何在文件中,但不是你的班級? –

+0

正如我對Dan Getz所說的,我想能夠做'import foo'。如果我使用你的代碼,它也會失敗'import foo'。我希望它只在'from foo import Bar1'上失敗 – svituz

0

它可能不是你在找什麼......但你想改變處理導入的默認機制。

try: 
    from package import Mod1 
except ImportError: 
    raise MissingDependency 
1

有興趣的那些,我發現執行PEP0302

基本上我寫了一個取景器和裝載類水溶液,並添加它來sys.meta_path

import sys 
import imp 

class MyLoader(object): 
    def find_module(self, name, path=None): 
     try: 
      return imp.find_module(name, path) 
     except ImportError as ie: 
      if name == 'foo.Bar1': 
       raise MissingDependency() 
      raise ie 

    def load_module(self, name): 
     return imp.load_module(name) 

try: 
    from .bar1 import Bar1 
except: 
    pass 

try: 
    from .bar2 import Bar2 
except: 
    pass 

sys.meta_path = [MyLoader()]