From: Evan Broder <broder@mit.edu>
Date: Sun, 22 Nov 2009 21:07:29 +0000 (-0500)
Subject: Add an __iter__ method to invirt.common.struct.
X-Git-Tag: 0.0.26~9
X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/commitdiff_plain/d0bf0e362df11c1bf74fce3bc80ecd6d95ec8b41

Add an __iter__ method to invirt.common.struct.

svn path=/trunk/packages/invirt-base/; revision=2551
---

diff --git a/python/invirt/common.py b/python/invirt/common.py
index f228a33..603b7f3 100644
--- a/python/invirt/common.py
+++ b/python/invirt/common.py
@@ -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()