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

Blo*_*nor 3 python module python-module

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

try:
  import some_module
except ImportError:
  print "No some_module!"
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*lli 7

执行请求需要诡计(并且一个raise语句实际上是不可避免的,因为它是PEP 302中指定的唯一方式,导入钩子说"我不处理此路径项"!),但以下会避免任何try/ except:

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')
Run Code Online (Sandbox Code Playgroud)

这打印:

sys True
Cookie True
nonexistent False
Run Code Online (Sandbox Code Playgroud)

当然,这些将是荒谬的长度去在现实生活中,以避免一个完全正常的无谓目的try/ except,但他们似乎满足的要求也提出了(可以希望提示Python的巫师崇拜者,开始自己的研究-找出所有这些代码确实如何以及为什么按要求工作的事实上是有益的,这就是为什么我曾经没有提供详细的解释和URL ;-).