[Python-checkins] r65981 - in sandbox/trunk/2to3: README lib2to3/fixes/fix_paren.py lib2to3/tests/test_fixers.py
benjamin.peterson
python-checkins at python.org
Fri Aug 22 22:41:31 CEST 2008
Author: benjamin.peterson
Date: Fri Aug 22 22:41:30 2008
New Revision: 65981
Log:
add a fixer to add parenthese for list and gen comps #2367
Added:
sandbox/trunk/2to3/lib2to3/fixes/fix_paren.py (contents, props changed)
Modified:
sandbox/trunk/2to3/README
sandbox/trunk/2to3/lib2to3/tests/test_fixers.py
Modified: sandbox/trunk/2to3/README
==============================================================================
--- sandbox/trunk/2to3/README (original)
+++ sandbox/trunk/2to3/README Fri Aug 22 22:41:30 2008
@@ -90,6 +90,9 @@
* **fix_numliterals** - tweak certain numeric literals to be 3.0-compliant.
+* **fix_paren** - Add parentheses to places where they are needed in list
+ comprehensions and generator expressions.
+
* **fix_print** - convert "print" statements to print() function calls.
* **fix_raise** - convert "raise" statements to Python 3 syntax (PEP 3109).
Added: sandbox/trunk/2to3/lib2to3/fixes/fix_paren.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/2to3/lib2to3/fixes/fix_paren.py Fri Aug 22 22:41:30 2008
@@ -0,0 +1,42 @@
+"""Fixer that addes parentheses where they are required
+
+This converts ``[x for x in 1, 2]`` to ``[x for x in (1, 2)]``."""
+
+# By Taek Joo Kim and Benjamin Peterson
+
+# Local imports
+from .. import fixer_base
+from ..fixer_util import LParen, RParen
+
+# XXX This doesn't support nested for loops like [x for x in 1, 2 for x in 1, 2]
+class FixParen(fixer_base.BaseFix):
+ PATTERN = """
+ atom< ('[' | '(')
+ (listmaker< any
+ comp_for<
+ 'for' NAME 'in'
+ target=testlist_safe< any (',' any)+ [',']
+ >
+ [any]
+ >
+ >
+ |
+ testlist_gexp< any
+ comp_for<
+ 'for' NAME 'in'
+ target=testlist_safe< any (',' any)+ [',']
+ >
+ [any]
+ >
+ >)
+ (']' | ')') >
+ """
+
+ def transform(self, node, results):
+ target = results["target"]
+
+ lparen = LParen()
+ lparen.set_prefix(target.get_prefix())
+ target.set_prefix("") # Make it hug the parentheses
+ target.insert_child(0, lparen)
+ target.append_child(RParen())
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 Aug 22 22:41:30 2008
@@ -3377,6 +3377,65 @@
self.check(b, a)
+class Test_paren(FixerTestCase):
+ fixer = "paren"
+
+ def test_0(self):
+ b = """[i for i in 1, 2 ]"""
+ a = """[i for i in (1, 2) ]"""
+ self.check(b, a)
+
+ def test_1(self):
+ b = """[i for i in 1, 2, ]"""
+ a = """[i for i in (1, 2,) ]"""
+ self.check(b, a)
+
+ def test_2(self):
+ b = """[i for i in 1, 2 ]"""
+ a = """[i for i in (1, 2) ]"""
+ self.check(b, a)
+
+ def test_3(self):
+ b = """[i for i in 1, 2 if i]"""
+ a = """[i for i in (1, 2) if i]"""
+ self.check(b, a)
+
+ def test_4(self):
+ b = """[i for i in 1, 2 ]"""
+ a = """[i for i in (1, 2) ]"""
+ self.check(b, a)
+
+ def test_5(self):
+ b = """(i for i in 1, 2)"""
+ a = """(i for i in (1, 2))"""
+ self.check(b, a)
+
+ def test_6(self):
+ b = """(i for i in 1 ,2 if i)"""
+ a = """(i for i in (1 ,2) if i)"""
+ self.check(b, a)
+
+ def test_unchanged_0(self):
+ s = """[i for i in (1, 2)]"""
+ self.unchanged(s)
+
+ def test_unchanged_1(self):
+ s = """[i for i in foo()]"""
+ self.unchanged(s)
+
+ def test_unchanged_2(self):
+ s = """[i for i in (1, 2) if nothing]"""
+ self.unchanged(s)
+
+ def test_unchanged_3(self):
+ s = """(i for i in (1, 2))"""
+ self.unchanged(s)
+
+ def test_unchanged_4(self):
+ s = """[i for i in m]"""
+ self.unchanged(s)
+
+
if __name__ == "__main__":
import __main__
support.run_all_tests(__main__)
More information about the Python-checkins
mailing list