Add an __iter__ method to invirt.common.struct.
authorEvan Broder <broder@mit.edu>
Sun, 22 Nov 2009 21:07:29 +0000 (16:07 -0500)
committerEvan Broder <broder@mit.edu>
Sun, 22 Nov 2009 21:07:29 +0000 (16:07 -0500)
svn path=/trunk/packages/invirt-base/; revision=2551

python/invirt/common.py

index f228a33..603b7f3 100644 (file)
@@ -12,8 +12,11 @@ class struct(object):
     'A simple namespace object.'
     def __init__(self, d = {}, __prefix = None, **kwargs):
         'd is the dictionary or the items-iterable to update my __dict__ with.'
-        self.__dict__.update(d)
-        self.__dict__.update(kwargs)
+        dct = {}
+        dct.update(d)
+        dct.update(kwargs)
+        self.__dict__.update(dct)
+        self.__keys = set(dct)
         self.__prefix = __prefix
     def __getattr__(self, key):
         # XX ideally these would point a frame higher on the stack.
@@ -24,6 +27,9 @@ class struct(object):
         else:
             raise AttributeError("anonymous struct has no member '%s'"
                                  % (key,))
+    def __iter__(self):
+        for i in self.__keys:
+            yield i
 
 def dicts2struct(x, prefix = None):
     """
@@ -118,6 +124,7 @@ class common_tests(unittest.TestCase):
         self.assertEqual(structs.dict.list,   dicts['dict']['list'])
         self.assertEqual(structs.list[0],     dicts['list'][0])
         self.assertEqual(structs.list[1].key, dicts['list'][1]['key'])
+        self.assertEqual(set(structs), set(['atom', 'dict', 'list']))
 
 if __name__ == '__main__':
     unittest.main()