我有一个包含这样结构的包:
foo/
__init__.py
bar1.py
bar2.py
bar1
和bar2
有Bar1
和Bar2
个班级。我已将__init__.py
导入到类中以便允许
from foo import Bar1
而不是写
from foo.bar1 import Bar1
好的,这个工作正常,现在是棘手的部分。
bar1
和bar2
在导入时会引发异常MissingDependency
,但缺少某些依赖项
所以我的__init__.py
就像这样实现了
try:
from .bar1 import Bar1
except MissingDependency:
pass
try:
from .bar2 import Bar2
except MissingDependency:
pass
这意味着foo
的导入有效但不导入Bar1
或Bar2
import foo
现在,我想要做的是在您尝试导入Bar1时引发MissingDependency
,但它失败了。
目前发生的事情是
from foo import Bar1
...
ImportError: cannot import name Bar1
我希望它引发MissingDependency
from foo import Bar1
...
MissingDependency: "Cannot import Bar1"
编辑:我用包名
更正了一些错误答案 0 :(得分:1)
对于感兴趣的人,我找到了实施PEP0302
的解决方案基本上我写了一个finder和loader类,并将它添加到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()]
答案 1 :(得分:0)
我不是百分之百确定你为什么会这样,但你可以提出一个不同的例外:
try:
from package import Mod1
except ImportError:
raise MissingDependency("Cannot import Mod1")
答案 2 :(得分:0)
它可能不是您要找的......但您想要更改处理导入的默认机制。
try:
from package import Mod1
except ImportError:
raise MissingDependency