Требуется хитрость для выполнения запроса (и один оператор 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')
Это печатает:
sys True
Cookie True
nonexistent False
Конечно, это было бы абсурдным шагом в реальной жизни с бессмысленной целью избежать совершенно нормального try
/ except
, но они, кажется, удовлетворяют поставленную задачу (и, мы надеемся, могут подсказать Python- Волшебники хотят начать собственное исследование - выяснить, как и почему весь этот код работает так, как требуется, на самом деле поучительно, поэтому на этот раз я не предлагаю подробных объяснений и URL; -).