[Python-checkins] r80922 - in sandbox/trunk/2to3/lib2to3: fixes/fix_xrange.py tests/test_fixers.py

benjamin.peterson python-checkins at python.org
Fri May 7 18:06:25 CEST 2010


Author: benjamin.peterson
Date: Fri May  7 18:06:25 2010
New Revision: 80922

Log:
prevent xrange transformation from wrapping range calls it produces in list

Modified:
   sandbox/trunk/2to3/lib2to3/fixes/fix_xrange.py
   sandbox/trunk/2to3/lib2to3/tests/test_fixers.py

Modified: sandbox/trunk/2to3/lib2to3/fixes/fix_xrange.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/fixes/fix_xrange.py	(original)
+++ sandbox/trunk/2to3/lib2to3/fixes/fix_xrange.py	Fri May  7 18:06:25 2010
@@ -17,6 +17,13 @@
               rest=any* >
               """
 
+    def start_tree(self, tree, filename):
+        super(FixXrange, self).start_tree(tree, filename)
+        self.transformed_xranges = set()
+
+    def finish_tree(self, tree, filename):
+        self.transformed_xranges = None
+
     def transform(self, node, results):
         name = results["name"]
         if name.value == u"xrange":
@@ -29,9 +36,12 @@
     def transform_xrange(self, node, results):
         name = results["name"]
         name.replace(Name(u"range", prefix=name.prefix))
+        # This prevents the new range call from being wrapped in a list later.
+        self.transformed_xranges.add(id(node))
 
     def transform_range(self, node, results):
-        if not self.in_special_context(node):
+        if (id(node) not in self.transformed_xranges and
+            not self.in_special_context(node)):
             range_call = Call(Name(u"range"), [results["args"].clone()])
             # Encase the range call in list().
             list_call = Call(Name(u"list"), [range_call],

Modified: sandbox/trunk/2to3/lib2to3/tests/test_fixers.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/tests/test_fixers.py	(original)
+++ sandbox/trunk/2to3/lib2to3/tests/test_fixers.py	Fri May  7 18:06:25 2010
@@ -1497,6 +1497,17 @@
         for call in fixer_util.consuming_calls:
             self.unchanged("a = %s(range(10))" % call)
 
+class Test_xrange_with_reduce(FixerTestCase):
+
+    def setUp(self):
+        super(Test_xrange_with_reduce, self).setUp(["xrange", "reduce"])
+
+    def test_double_transform(self):
+        b = """reduce(x, xrange(5))"""
+        a = """from functools import reduce
+reduce(x, range(5))"""
+        self.check(b, a)
+
 class Test_raw_input(FixerTestCase):
     fixer = "raw_input"
 


More information about the Python-checkins mailing list