Source code for soma.global_naming

# -*- coding: utf-8 -*-

from __future__ import absolute_import
import re
from inspect import isfunction, isclass, ismethod
from weakref import WeakKeyDictionary

from soma.singleton import Singleton


[docs]class GlobalNaming(Singleton): """ No doc ? """ def __singleton_init__(self): super(GlobalNaming, self).__singleton_init__() self._global_name_re = re.compile( r'(([A-Za-z][A-Za-z0-9_.]*)\.([A-Za-z0-9_]+))(\(\))?((\.)([A-Za-z][A-Za-z0-9_.]+))?') self._names = WeakKeyDictionary()
[docs] def parse_global_name(self, global_name): """ """ m = self._global_name_re.match(global_name) if m: # return module, name, args, attributes return m.group(2), m.group(3), (() if m.group(4) else None), m.group(7) raise ValueError('Invalid global name syntax: ' + global_name)
[docs] def get_object(self, global_name): """ """ module, name, args, attributes = self.parse_global_name(global_name) module = __import__(module, fromlist=[name], level=0) try: value = getattr(module, name) except AttributeError as e: raise ImportError(str(e)) if args is not None: value = value(*args) if attributes: for a in attributes.split('.'): value = getattr(value, a) self._names[value] = global_name return value
[docs] def get_name(self, obj): """ """ result = self._names.get(obj) if result is not None: return result if isfunction(obj) or isclass(obj): return obj.__module__ + '.' + obj.__name__ elif ismethod(obj): if obj.__self__ is not None: return obj.__class__.__module__ + '.' + obj.__class__.__name__ + '().' + obj.__func__.__name__ elif isinstance(obj, object): return obj.__class__.__module__ + '.' + obj.__class__.__name__ + '()' raise ValueError('Cannot find global name for %s' % repr(obj))
[docs]def get_object(global_name): """ """ return GlobalNaming().get_object(global_name)
[docs]def get_name(obj): """ """ return GlobalNaming().get_name(obj)