Changeset 3037:c03fd78a9520 in livinglogic.python.xist

Show
Ignore:
Timestamp:
11/26/07 10:14:25 (12 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add getattr functionality to Pool. Make VPool a simple list of modules.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/xist/xsc.py

    r3036 r3037  
    34033403        self._attrsbyxmlname = weakref.WeakValueDictionary() 
    34043404        self._attrsbypyname = weakref.WeakValueDictionary() 
     3405        self._attrs = weakref.WeakValueDictionary() 
    34053406        for object in objects: 
    34063407            self.register(object) 
     
    34503451                    self.register(attr) 
    34513452        elif isinstance(object, types.ModuleType): 
    3452             for value in object.__dict__.itervalues(): 
     3453            for (key, value) in object.__dict__.iteritems(): 
    34533454                if isinstance(value, type): # This avoids recursive module registration 
    34543455                    self.register(value) 
     3456                try: 
     3457                    self._attrs[key] = value 
     3458                except TypeError: 
     3459                    pass 
    34553460        elif isinstance(object, dict): 
    3456             for value in object.itervalues(): 
     3461            for (key, value) in object.iteritems(): 
    34573462                if isinstance(value, type): # This avoids recursive module registration 
    34583463                    self.register(value) 
     3464                try: 
     3465                    self._attrs[key] = value 
     3466                except TypeError: 
     3467                    pass 
    34593468 
    34603469    def __enter__(self): 
     
    37653774        return Comment(content) 
    37663775 
     3776    def __getattr__(self, key): 
     3777        try: 
     3778            return self._attrs[key] 
     3779        except KeyError: 
     3780            raise AttributeError(key) 
     3781 
    37673782    def clone(self): 
    37683783        """ 
     
    37813796        copy._attrsbyxmlname = self._attrsbyxmlname.copy() 
    37823797        copy._attrsbypyname = self._attrsbypyname.copy() 
     3798        copy._attrs = self._attrs.copy() 
    37833799        return copy 
    37843800 
     
    39984014 
    39994015 
    4000 class VPool(Pool): 
     4016class VPool(object): 
    40014017    def __init__(self, *modules): 
    40024018        """ 
     
    40044020        to the <method>register</method> method.</par> 
    40054021        """ 
    4006         self._attrs = weakref.WeakValueDictionary() 
    4007         Pool.__init__(self, *modules[::-1]) 
    4008  
    4009     def register(self, object): 
    4010         Pool.register(self, object) 
    4011         if isinstance(object, types.ModuleType): 
    4012             for (key, value) in object.__dict__.iteritems(): 
    4013                 try: 
    4014                     self._attrs[key] = value 
    4015                 except TypeError: 
    4016                     pass 
     4022        self.modules = modules 
    40174023 
    40184024    def __getattr__(self, key): 
    4019         try: 
    4020             attr = self._attrs[key] 
    4021         except KeyError: 
    4022             raise AttributeError(key) 
    4023         else: 
    4024             if isinstance(attr, _Node_Meta): 
    4025                 def factory(*args, **kwargs): 
    4026                     obj = attr(*args, **kwargs) 
    4027                     obj.pool = self 
    4028                     return obj 
    4029                 factory.__name__ = key 
    4030                 return factory 
    4031             return attr 
     4025        for module in self.modules: 
     4026            try: 
     4027                attr = getattr(module, key) 
     4028            except AttributeError: 
     4029                pass 
     4030            else: 
     4031                if isinstance(attr, _Node_Meta): 
     4032                    def factory(*args, **kwargs): 
     4033                        obj = attr(*args, **kwargs) 
     4034                        obj.pool = self 
     4035                        return obj 
     4036                    factory.__name__ = key 
     4037                    return factory 
     4038                return attr 
     4039        raise AttributeError(key) 
    40324040 
    40334041    def __repr__(self): 
    4034         return "<%s.%s object with %d items at 0x%x>" % (self.__class__.__module__, self.__class__.__name__, len(self._attrs), id(self)) 
     4042        return "<%s.%s object with %d items at 0x%x>" % (self.__class__.__module__, self.__class__.__name__, len(self.modules), id(self)) 
    40354043 
    40364044