python: Add a utility for nested attribute dicts.
authorNathan Binkert <nate@binkert.org>
Fri, 10 Oct 2008 17:15:00 +0000 (10:15 -0700)
committerNathan Binkert <nate@binkert.org>
Fri, 10 Oct 2008 17:15:00 +0000 (10:15 -0700)
Change attrdict so that attributes that begin with an underscore don't
go into the dict.

src/python/m5/util/attrdict.py

index 44479c456f39f6f3dba51f3daab7cbc50cafc683..56f67217b688c5bab445aa5b985be7a9c691e011 100644 (file)
 #
 # Authors: Nathan Binkert
 
-__all__ = [ 'attrdict', 'optiondict' ]
+__all__ = [ 'attrdict', 'multiattrdict', 'optiondict' ]
 
 class attrdict(dict):
+    """Wrap dict, so you can use attribute access to get/set elements"""
     def __getattr__(self, attr):
         if attr in self:
             return self.__getitem__(attr)
         return super(attrdict, self).__getattribute__(attr)
 
     def __setattr__(self, attr, value):
-        if attr in dir(self):
+        if attr in dir(self) or attr.startswith('_'):
             return super(attrdict, self).__setattr__(attr, value)
         return self.__setitem__(attr, value)
 
@@ -44,13 +45,23 @@ class attrdict(dict):
             return self.__delitem__(attr)
         return super(attrdict, self).__delattr__(attr, value)
 
+class multiattrdict(attrdict):
+    """Wrap attrdict so that nested attribute accesses automatically create
+    nested dictionaries."""
+    def __getattr__(self, attr):
+        try:
+            return super(multiattrdict, self).__getattr__(attr)
+        except AttributeError:
+            d = optiondict()
+            setattr(self, attr, d)
+            return d
+
 class optiondict(attrdict):
+    """Modify attrdict so that a missing attribute just returns None"""
     def __getattr__(self, attr):
         try:
             return super(optiondict, self).__getattr__(attr)
         except AttributeError:
-            #d = optionsdict()
-            #setattr(self, attr, d)
             return None
 
 if __name__ == '__main__':
@@ -68,3 +79,9 @@ if __name__ == '__main__':
     del x.z
     print dir(x)
     print(x)
+
+    x = multiattrdict()
+    x.y.z = 9
+    print x
+    print x.y
+    print x.y.z