Source code for alphatwirl.selection.factories.FactoryDispatcher

# Tai Sakuma <tai.sakuma@cern.ch>

##__________________________________________________________________||
[docs]def FactoryDispatcher(path_cfg, **kargs): aliasDict = kargs['aliasDict'] if 'aliasDict' in kargs else None path_cfg = expand_path_cfg(path_cfg, aliasDict = aliasDict) if not isinstance(path_cfg, dict): raise ValueError("cannot recognize the path_cfg") if 'factory' not in path_cfg: raise ValueError("cannot recognize the path_cfg") path_cfg_copy = path_cfg.copy() factoryName = path_cfg_copy.pop('factory') factory = find_factory(factoryName) kargs_copy = kargs.copy() kargs_copy.update(path_cfg_copy) return factory(**kargs_copy)
##__________________________________________________________________||
[docs]def expand_path_cfg(path_cfg, aliasDict = None, overriding_kargs = dict()): if isinstance(path_cfg, str): if aliasDict is not None and path_cfg in aliasDict: new_overriding_kargs = dict(alias = path_cfg) new_overriding_kargs.update(overriding_kargs) return expand_path_cfg(aliasDict[path_cfg], aliasDict = aliasDict, overriding_kargs = new_overriding_kargs) ret = dict(factory = 'LambdaStrFactory', lambda_str = path_cfg) overriding_kargs_copy = overriding_kargs.copy() if 'alias' in overriding_kargs: ret['name'] = overriding_kargs_copy.pop('alias') if 'name' in overriding_kargs: ret['name'] = overriding_kargs_copy.pop('name') ret.update(overriding_kargs_copy) return ret if not isinstance(path_cfg, dict): # assume tuple or list if isinstance(path_cfg[0], str) and isinstance(path_cfg[1], dict): new_overriding_kargs = path_cfg[1].copy() new_overriding_kargs.update(overriding_kargs) return expand_path_cfg(path_cfg[0], overriding_kargs = new_overriding_kargs, aliasDict = aliasDict) raise ValueError("cannot recognize the path_cfg") if isinstance(path_cfg, dict): if 'factory' in path_cfg: return path_cfg if not sum([k in path_cfg for k in ('All', 'Any', 'Not')]) <= 1: raise ValueError("Any pair of 'All', 'Any', 'Not' cannot be simultaneously given unless factory is given!") if 'All' in path_cfg: new_path_cfg = path_cfg.copy() new_path_cfg['factory'] = 'AllFactory' new_path_cfg['path_cfg_list'] = new_path_cfg.pop('All') return new_path_cfg if 'Any' in path_cfg: new_path_cfg = path_cfg.copy() new_path_cfg['factory'] = 'AnyFactory' new_path_cfg['path_cfg_list'] = new_path_cfg.pop('Any') return new_path_cfg if 'Not' in path_cfg: new_path_cfg = path_cfg.copy() new_path_cfg['factory'] = 'NotFactory' new_path_cfg['path_cfg'] = new_path_cfg.pop('Not') return new_path_cfg raise ValueError("cannot recognize the path_cfg")
##__________________________________________________________________||
[docs]def find_factory(name): import imp top_module_name = 'factories' f, filename, description = imp.find_module(top_module_name) top_module = imp.load_module(top_module_name, f, filename, description) ##______________________________________________________________|| module_name = "{}.{}".format(top_module_name, name) # e.g., 'factories.AllFactory' f, filename, description = imp.find_module(name, top_module.__path__) module = imp.load_module(module_name, f, filename, description) factory = getattr(module, name) return factory
##__________________________________________________________________||