[Checkins] SVN: z3c.pt/trunk/src/z3c/pt/ Raise friendly exception if we're repeating over a non-iterable.

Malthe Borch mborch at gmail.com
Tue Aug 12 19:04:35 EDT 2008


Log message for revision 89761:
  Raise friendly exception if we're repeating over a non-iterable.

Changed:
  U   z3c.pt/trunk/src/z3c/pt/clauses.py
  U   z3c.pt/trunk/src/z3c/pt/utils.py

-=-
Modified: z3c.pt/trunk/src/z3c/pt/clauses.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/clauses.py	2008-08-12 22:48:42 UTC (rev 89760)
+++ z3c.pt/trunk/src/z3c/pt/clauses.py	2008-08-12 23:04:35 UTC (rev 89761)
@@ -603,6 +603,17 @@
       >>> _repeat.end(stream)
       >>> exec stream.getvalue()
 
+    A repeat over a non-iterable raises an exception.
+
+      >>> stream = CodeIO()
+      >>> _repeat = Repeat("j", pyexp("None"))
+      >>> _repeat.begin(stream)
+      >>> _repeat.end(stream)
+      >>> exec stream.getvalue()
+      Traceback (most recent call last):
+       ...
+      TypeError: Can only repeat over an iterable object (None).
+      
     Simple for loop:
 
       >>> stream = CodeIO()

Modified: z3c.pt/trunk/src/z3c/pt/utils.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/utils.py	2008-08-12 22:48:42 UTC (rev 89760)
+++ z3c.pt/trunk/src/z3c/pt/utils.py	2008-08-12 23:04:35 UTC (rev 89761)
@@ -87,8 +87,17 @@
 
 class repeatdict(dict):
     def insert(self, key, iterable):
-        length = len(iterable)
-        iterator = iterable.__iter__()
+        try:
+            length = len(iterable)
+        except TypeError:
+            length = None
+            
+        try:
+            iterator = iterable.__iter__()
+        except AttributeError:
+            raise TypeError(
+                "Can only repeat over an iterable object (%s)." % iterable)
+        
         self[key] = (iterator, length)
         return iterator
         



More information about the Checkins mailing list