import importlib
import synapse.exc as s_exc
import synapse.common as s_common
import logging
logger = logging.getLogger(__name__)
[docs]
def getDynMod(name):
'''
Dynamically import a python module and return a ref (or None).
Example:
mod = getDynMod('foo.bar')
'''
try:
return importlib.import_module(name)
except ImportError:
logger.exception(f'Failed to import "{name}"')
return None
[docs]
def getDynLocal(name):
'''
Dynamically import a python module and return a local.
Example:
cls = getDynLocal('foopkg.barmod.BlahClass')
blah = cls()
'''
if name.find('.') == -1:
return None
modname, objname = name.rsplit('.', 1)
mod = getDynMod(modname)
if mod is None:
return None
return getattr(mod, objname, None)
[docs]
def getDynMeth(name):
'''
Retrieve and return an unbound method by python path.
'''
cname, fname = name.rsplit('.', 1)
clas = getDynLocal(cname)
if clas is None:
return None
return getattr(clas, fname, None)
[docs]
def tryDynMod(name):
'''
Dynamically import a python module or exception.
'''
try:
return importlib.import_module(name)
except ModuleNotFoundError:
raise s_exc.NoSuchDyn(name=name)
[docs]
def tryDynLocal(name):
'''
Dynamically import a module and return a module local or raise an exception.
'''
if name.find('.') == -1:
raise s_exc.NoSuchDyn(name=name)
modname, objname = name.rsplit('.', 1)
mod = tryDynMod(modname)
item = getattr(mod, objname, s_common.novalu)
if item is s_common.novalu:
raise s_exc.NoSuchDyn(name=name)
return item
[docs]
def tryDynFunc(name, *args, **kwargs):
'''
Dynamically import a module and call a function or raise an exception.
'''
return tryDynLocal(name)(*args, **kwargs)
[docs]
def runDynTask(task):
'''
Run a dynamic task and return the result.
Example:
foo = runDynTask( ('baz.faz.Foo', (), {} ) )
'''
func = getDynLocal(task[0])
if func is None:
raise s_exc.NoSuchFunc(name=task[0])
return func(*task[1], **task[2])