Source code for benchmarkstt.modules

import sys
from importlib import import_module

_modules = ['normalization', 'metrics', 'benchmark']

if sys.version_info >= (3, 6):
    # only supported in python >= 3.6
    _modules.append('api')


[docs]class Modules: def __init__(self, sub_module): self._postfix = '' if sub_module is None else '.' + sub_module def __iter__(self): for module in _modules: try: yield (module, self[module]) except IndexError: pass def __getattr__(self, name): return self[name] def __getitem__(self, key): name = 'benchmarkstt.%s%s' % (key, self._postfix) try: module = import_module(name) if hasattr(module, 'hidden'): if module.hidden: raise ImportError() return module except ImportError: raise IndexError('Module not found', key)
[docs] def keys(self): return [key for key, value in iter(self)]
[docs]def load_object(name, transform=None): """ Load an object based on a string. :param name: The string representation of an object :param transform: Transform (callable) done on the object name for comparison, if None, will lowercase compare. False for no transform. """ module = list(name.split('.')) if transform is None: transform = str.lower elif transform is False: def identity(x): return x transform = identity class_name = transform(module.pop()) module = '.'.join(module) if len(module) == 0: module = globals() else: module = import_module(module) for found_class_name in dir(module): if transform(found_class_name) != class_name: continue return getattr(module, found_class_name) raise ImportError("Could not find an object for %r" % (name,))
[docs]class Proxy: """ Pass all function calls to instance, or to parent class if instance does not implement it. """ def __init__(self, instance): self._instance = instance def __getattribute__(self, item): cls = object.__getattribute__(self, '_instance') if item == '_instance': return cls if hasattr(cls, item): return getattr(cls, item) return object.__getattribute__(self, item)
[docs]class LoadObjectProxy(Proxy): """ Automatically load a class from any namespace, and pass all function calls to it, or to parent class if it is not implemented. """ def __init__(self, name, *args, **kwargs): super().__init__(load_object(name)(*args, **kwargs))