只需将猴子补丁添加到builtins
您自己的版本中,__import__
当它意识到要在其上模拟错误的特定模块上正在调用它时,它可以引发您想要的任何事情。有关详细信息,请参阅文档。大致:
try:
import builtins
except ImportError:
import __builtin__ as builtins
realimport = builtins.__import__
def myimport(name, globals, locals, fromlist, level):
if ...:
raise ImportError
return realimport(name, globals, locals, fromlist, level)
builtins.__import__ = myimport
代替...
,您可以硬编码name == 'zope.component'
或使用自己的回调更灵活地安排事务,这可以使导入在不同情况下按需提高,具体取决于您的特定测试需求,而无需您编写多个__import__
类似的函数;-) 。
还需要注意的是,如果你使用的是什么,而不是import zope.component
或者from zope.component import something
,是from zope import component
时,name
届时将'zope'
,并'component'
随后将是唯一的项目fromlist
。
:该__import__
函数的文档说要导入的名称是builtin
(就像在Python 3中一样),但实际上您需要__builtins__
-我已经编辑了上面的代码,因此无论哪种方式都可以。