Source code for vmware.vapi.lib.load

"""
Convenience methods for dynamic loading
"""

__author__ = 'VMware, Inc.'
__copyright__ = 'Copyright (c) 2015 VMware, Inc.  All rights reserved.'

import logging
import six

from vmware.vapi.settings import config

logger = logging.getLogger(__name__)


[docs]def dynamic_import(constructor): """ Dynamically import a module and get the specified module attribute :type constructor: :class:`str` :param constructor: Fully qualified module attribute :rtype: :class:`object` :return: Python object """ target_attr = None if constructor: if isinstance(constructor, six.string_types): try: module_name, fn = constructor.rsplit('.', 1) module = __import__(module_name, globals(), locals(), [fn]) target_attr = getattr(module, fn) except ImportError as err: logger.exception('Import failed: %s: module %s fn %s', str(err), module_name, fn) target_attr = None except AttributeError as err: logger.exception('Import failed: Module %s has no %s', module_name, fn) target_attr = None return target_attr
[docs]def import_multiple_classes(section, property_key): """ Import multiple class names provided in the config file :type section: :class:`str` :param section: Name of the section in the config file :type property_key: :class:`str` :param property_key: Name of the property in the config file :rtype: :class:`list` of :class:`str` :return: List of class references """ cfg = config.cfg classes = [] if cfg and cfg.has_section(section) and cfg.has_option(section, property_key): class_names = cfg.get(section, property_key).split(',') for class_name in class_names: class_name = class_name.strip() class_ref = dynamic_import(class_name) if class_ref is not None: classes.append(class_ref()) return classes