Slide 15
Slide 15 text
#Вариант третий – инспектирование модуля для поиска плагинов
import inspect
import pkgutil
from django.utils.importlib import import_module
from shop import services
def get_backends(init=False, initial_data=None, as_list=True):
if as_list:
backends = []
else:
И ДИСПЕТЧЕР
pkgutil.iter_modules(path=None, prefix='')
Возвращает кортеж (module_loader, name,
ispkg) для всех подмодулей
import_module(name, package=None)
Импортирует модуль. Удобство в том, что если
else:
backends = {}
for mod in pkgutil.iter_modules(services.__path__):
module = import_module('.{0}'.format(mod[1]), 'shop.services')
predicate = lambda x: inspect.isclass(x) and issubclass(x, services.BaseService) and not
x == services.BaseService
for name, backend in inspect.getmembers(module, predicate):
if init:
value = backend(data=initial_data)
else:
value = backend
if as_list:
backends.append(value)
else:
backends.update({backend.keyword: value})
return backends
ispkg) для всех подмодулей
Импортирует модуль. Удобство в том, что если
передать имя начинающееся с точки ".name",
то поиск для импорта будет производиться не
по sys.path, а только в указанном во втором
аргументе пакете.
inspect.getmembers(object[, predicate])
Возвращает список всех членов объекта
(аттрибуты, функции, классы и т.д.). Если
качестве второго аргумента передать
функцию-ограничитель, то inspect.getmembers
вернет только те члены, для которых predicate
вернет True