Глава 6. Модули
242
связанные с пакетами, и работая только с простыми модулями) путем создания
пользовательского модуля импортера, как показано ниже.
import sys, types
class ImporterAndLoader(object):
'''Импортер и загрузчик часто совмещаются в одном классе'''
fake_path = '!dummy!'
def __init__(self, path):
# Обрабатывать только собственный фиктивный маркер пути
if path != self.fake_path: raise ImportError
def find_module(self, fullname):
# Даже не пытаться обрабатывать любое полное имя модуля
if '.' in fullname: return None
return self
def create_module(self, spec):
# Выполняется только в v3: создает модуль
# принятым по умолчанию способом
return None
def exec_module(self, mod):
# Выполняется только в v3: заполняет уже
# инициализированный модуль;
# в этом примере просто выводится сообщение
print('ПРИМЕЧАНИЕ: module {!r} еще не написан'.format(mod))
def load_module(self, fullname):
# Выполняется только в v2: создает и заполняет модуль
if fullname in sys.modules: return sys.modules[fullname]
# В этом примере просто выводится сообщение
print('ПРИМЕЧАНИЕ: module {!r} еще не написан'.format(fullname))
# Создать новый пустой модуль, занести его в sys.modules
mod = sys.modules[fullname] = types.ModuleType(fullname)
# Минимальная инициализация нового модуля и его возврат
mod.__file__ = 'dummy_{}'.format(fullname)
mod.__loader__ = self
return mod
# Добавить класс в path_hooks, а фиктивный маркер его пути - в path
sys.path_hooks.append(ImporterAndLoader)
sys.path.append(ImporterAndLoader.fake_path)
if __name__ == '__main__': # самотестирование при запуске в
# качестве основного сценария
import missing_module # импортировать простой отсутствующий
# модуль
print(missing_module) # должно успешно выполниться
print(sys.modules.get('missing_module')) # также должно успешно
# выполниться
Python in a Nutshell.indb 242
19.09.2018 19:03:28
Do'stlaringiz bilan baham: |