25 __all__ = (
"doImport",)
 
   29     """Import a python object given an importable string and return it. 
   34         String containing dot-separated path of a Python class, module, 
   40         Type object. Either a module or class or a function. 
   45         ``importable`` is not a `str`. 
   47         No module in the supplied import string could be found. 
   49         ``importable`` is found but can not be imported or the requested 
   50         item could not be retrieved from the imported module. 
   52     if not isinstance(importable, str):
 
   53         raise TypeError(f
"Unhandled type of importable, val: {importable}")
 
   55     def tryImport(module, fromlist):
 
   56         pytype = importlib.import_module(module)
 
   60                 pytype = getattr(pytype, f)
 
   61             except AttributeError:
 
   62                 raise ImportError(f
"Could not get attribute '{f}' from '{module}'")
 
   68     moduleComponents = importable.split(
".")
 
   71     while moduleComponents:
 
   73             pytype = tryImport(
".".join(moduleComponents), infileComponents)
 
   74             if not infileComponents 
and hasattr(pytype, moduleComponents[-1]):
 
   80                     return tryImport(
".".join(moduleComponents[:-1]), moduleComponents[-1:])
 
   81                 except ModuleNotFoundError:
 
   84         except ModuleNotFoundError:
 
   86             infileComponents.insert(0, moduleComponents.pop())
 
   88     raise ModuleNotFoundError(f
"Unable to import {importable}")