2015-05-22 110 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()]