在Python中检查模块而不使用异常

我可以在
Python中检查一个模块,例如:

try:
  import some_module
except ImportError:
  print "No some_module!"

但我不想使用try / except.有没有办法实现这个目标? (它应该适用于Python 2.5.x.)

注意:不使用try / except的原因是任意的,这只是因为我想知道是否有办法在不使用异常的情况下测试它.

最佳答案 执行请求需要诡计(并且一个raise语句实际上是不可避免的,因为它是PEP 302中指定的唯一方式,导入钩子说“我不处理此路径项”!),但是以下将避免任何尝试/除外:

import sys

sentinel = object()

class FakeLoader(object):
  def find_module(self, fullname, path=None):
    return self
  def load_module(*_):
    return sentinel

def fakeHook(apath):
  if apath == 'GIVINGUP!!!':
    return FakeLoader()
  raise ImportError

sys.path.append('GIVINGUP!!!')
sys.path_hooks.append(fakeHook)

def isModuleOK(modulename):
  result = __import__(modulename)
  return result is not sentinel

print 'sys', isModuleOK('sys')
print 'Cookie', isModuleOK('Cookie')
print 'nonexistent', isModuleOK('nonexistent')

这打印:

sys True
Cookie True
nonexistent False

当然,这些在现实生活中为了避免完全正常的尝试/除外的无意义目的是荒谬的长度,但它们似乎满足了所提出的要求(并且可以有希望提示Python-Wizards想要开始他们自己的研究 – 确切地了解所有这些代码如何以及为什么按要求工作实际上是有益的,这就是为什么一旦我没有提供详细的解释和URL ;-).

点赞