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

benjamin.peterson python-checkins at python.org
Mon Feb 16 16:38:23 CET 2009


Author: benjamin.peterson
Date: Mon Feb 16 16:38:22 2009
New Revision: 69673

Log:
fix handling of as imports #5279

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

Modified: sandbox/trunk/2to3/lib2to3/fixes/fix_itertools_imports.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/fixes/fix_itertools_imports.py	(original)
+++ sandbox/trunk/2to3/lib2to3/fixes/fix_itertools_imports.py	Mon Feb 16 16:38:22 2009
@@ -1,8 +1,9 @@
 """ Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """
 
 # Local imports
-from .. import fixer_base
-from ..fixer_util import BlankLine
+from lib2to3 import fixer_base
+from lib2to3.fixer_util import BlankLine, syms, token
+
 
 class FixItertoolsImports(fixer_base.BaseFix):
     PATTERN = """
@@ -11,34 +12,40 @@
 
     def transform(self, node, results):
         imports = results['imports']
-        children = imports.children[:] or [imports]
-        for child in children:
-            if not hasattr(child, 'value'):
-                # Handle 'import ... as ...'
-                continue
-            if child.value in ('imap', 'izip', 'ifilter'):
-                # The value must be set to none in case child == import,
-                # so that the test for empty imports will work out
+        if imports.type == syms.import_as_name or not imports.children:
+            children = [imports]
+        else:
+            children = imports.children
+        for child in children[::2]:
+            if child.type == token.NAME:
+                member = child.value
+                name_node = child
+            else:
+                assert child.type == syms.import_as_name
+                name_node = child.children[0]
+            member_name = name_node.value
+            if member_name in ('imap', 'izip', 'ifilter'):
                 child.value = None
                 child.remove()
-            elif child.value == 'ifilterfalse':
+            elif member_name == 'ifilterfalse':
                 node.changed()
-                child.value = 'filterfalse'
+                name_node.value = 'filterfalse'
 
         # Make sure the import statement is still sane
         children = imports.children[:] or [imports]
         remove_comma = True
         for child in children:
-            if remove_comma and getattr(child, 'value', None) == ',':
+            if remove_comma and child.type == token.COMMA:
                 child.remove()
             else:
                 remove_comma ^= True
 
-        if unicode(children[-1]) == ',':
+        if children[-1].type == token.COMMA:
             children[-1].remove()
 
         # If there are no imports left, just get rid of the entire statement
-        if not (imports.children or getattr(imports, 'value', None)):
+        if not (imports.children or getattr(imports, 'value', None)) or \
+                imports.parent is None:
             p = node.get_prefix()
             node = BlankLine()
             node.prefix = p

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	Mon Feb 16 16:38:22 2009
@@ -3402,6 +3402,18 @@
         a = "from itertools import bar as bang"
         self.check(b, a)
 
+        b = "from itertools import izip as _zip, imap, bar"
+        a = "from itertools import bar"
+        self.check(b, a)
+
+        b = "from itertools import imap as _map"
+        a = ""
+        self.check(b, a)
+
+        b = "from itertools import imap as _map, izip as _zip"
+        a = ""
+        self.check(b, a)
+
         s = "from itertools import bar as bang"
         self.unchanged(s)
 


More information about the Python-checkins mailing list