changeset 04b9d1e7ef2c in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=04b9d1e7ef2c
description:
        python: Add a utility for nested attribute dicts.
        Change attrdict so that attributes that begin with an underscore don't
        go into the dict.

diffstat:

1 file changed, 2 insertions(+), 1 deletion(-)
src/python/m5/util/attrdict.py |    3 ++-

diffs (59 lines):

diff -r 05fd71ca96db -r 04b9d1e7ef2c src/python/m5/util/attrdict.py
--- a/src/python/m5/util/attrdict.py    Fri Oct 10 10:15:00 2008 -0700
+++ b/src/python/m5/util/attrdict.py    Fri Oct 10 10:15:00 2008 -0700
@@ -26,16 +26,17 @@
 #
 # 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 @@
             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 @@
     del x.z
     print dir(x)
     print(x)
+
+    x = multiattrdict()
+    x.y.z = 9
+    print x
+    print x.y
+    print x.y.z
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to