def resolve_name(import_name, silent=False): """Imports an object based on a string. This is useful if you want to use import paths as endpoints or something similar. An import path can be specified either in dotted notation (``xml.sax.saxutils.escape``) or with a colon as object delimiter (``xml.sax.saxutils:escape``). If `silent` is True the return value will be `None` if the import fails. :param import_name: the dotted name for the object to import. :param silent: if set to `True` import errors are ignored and `None` is returned instead. :return: imported object """ # force the import name to automatically convert to strings import_name = bytestring(import_name) try: if ':' in import_name: module, obj = import_name.split(':', 1) elif '.' in import_name: module, obj = import_name.rsplit('.', 1) else: return __import__(import_name) # __import__ is not able to handle unicode strings in the fromlist # if the module is a package try: return getattr(__import__(module, None, None, [obj]), obj) except (ImportError, AttributeError): # support importing modules not yet set up by the parent module # (or package for that matter) modname = module + '.' + obj __import__(modname) return sys.modules[modname] except ImportError as e: if not silent: raise_with_tb(ImportStringError(import_name, e))
def resolve_name(import_name, silent=False, reload=False): """Imports an object based on a string. This is useful if you want to use import paths as endpoints or something similar. An import path can be specified either in dotted notation (``xml.sax.saxutils.escape``) or with a colon as object delimiter (``xml.sax.saxutils:escape``). If `silent` is True the return value will be `None` if the import fails. :param import_name: the dotted name for the object to import. :param silent: if set to `True` import errors are ignored and `None` is returned instead. :param reload: if set to `True` modules that are already loaded will be reloaded :return: imported object """ # force the import name to automatically convert to strings import_name = bytestring(import_name) try: if ':' in import_name: module, obj = import_name.split(':', 1) elif '.' in import_name and import_name not in sys.modules: module, obj = import_name.rsplit('.', 1) else: module, obj = import_name, None # __import__ is not able to handle unicode strings in the fromlist mod = None # if the module is a package if reload and module in sys.modules: try: importlib.invalidate_caches() except Exception: pass try: mod = reload_module(sys.modules[module]) except Exception: pass if not mod: if not obj: return __import__(module) try: mod = __import__(module, None, None, [obj]) except ImportError: if ':' in import_name: raise return __import__(import_name) if not obj: return mod try: return getattr(mod, obj) except AttributeError: # support importing modules not yet set up by the parent module # (or package for that matter) if ':' in import_name: raise return __import__(import_name) except ImportError as e: if not silent: raise_with_tb(ImportStringError(import_name, e))