← Back to team overview

divmod-dev team mailing list archive

[Merge] lp:~dobey/divmod.org/pyflakes-less-redef into lp:divmod.org

 

Rodney Dawes has proposed merging lp:~dobey/divmod.org/pyflakes-less-redef into lp:divmod.org.

Commit message:
Add an ExceptHandler for dealing with ImportError cases of RedefinedWhileUnused.

Requested reviews:
  Divmod-dev (divmod-dev)

For more details, see:
https://code.launchpad.net/~dobey/divmod.org/pyflakes-less-redef/+merge/130183
-- 
https://code.launchpad.net/~dobey/divmod.org/pyflakes-less-redef/+merge/130183
Your team Divmod-dev is requested to review the proposed merge of lp:~dobey/divmod.org/pyflakes-less-redef into lp:divmod.org.
=== modified file 'Pyflakes/pyflakes/checker.py'
--- Pyflakes/pyflakes/checker.py	2012-01-10 19:09:22 +0000
+++ Pyflakes/pyflakes/checker.py	2012-10-17 17:34:20 +0000
@@ -194,6 +194,7 @@
 
     nodeDepth = 0
     traceTree = False
+    inImportError = False
 
     def __init__(self, tree, filename='(none)'):
         self._deferredFunctions = []
@@ -350,7 +351,7 @@
     EQ = NOTEQ = LT = LTE = GT = GTE = IS = ISNOT = IN = NOTIN = ignore
 
     # additional node types
-    COMPREHENSION = EXCEPTHANDLER = KEYWORD = handleChildren
+    COMPREHENSION = KEYWORD = handleChildren
 
     def addBinding(self, lineno, value, reportRedef=True):
         '''Called when a binding is altered.
@@ -367,7 +368,7 @@
                 if (isinstance(existing, Importation)
                         and not existing.used
                         and (not isinstance(value, Importation) or value.fullName == existing.fullName)
-                        and reportRedef):
+                        and reportRedef and not self.inImportError):
 
                     self.report(messages.RedefinedWhileUnused,
                                 lineno, value.name, scope[value.name].source.lineno)
@@ -632,3 +633,21 @@
             if node.module == '__future__':
                 importation.used = (self.scope, node.lineno)
             self.addBinding(node.lineno, importation)
+
+    def EXCEPTHANDLER(self, node):
+        """
+        We need to override this in order to note when we are inside
+        an ImportError exception handler, and avoid a RedefinedWhileUnused
+        message for the valid code:
+
+        try:
+            import foo
+        except ImportError:
+            import old_foo as foo
+        """
+        if isinstance(node.type, _ast.Name) and node.type.id == 'ImportError':
+            self.inImportError = True
+        try:
+            self.handleChildren(node)
+        finally:
+            self.inImportError = False

=== modified file 'Pyflakes/pyflakes/test/test_imports.py'
--- Pyflakes/pyflakes/test/test_imports.py	2011-10-31 15:19:35 +0000
+++ Pyflakes/pyflakes/test/test_imports.py	2012-10-17 17:34:20 +0000
@@ -24,6 +24,20 @@
         self.flakes('import fu; fu, bar = 3', m.RedefinedWhileUnused)
         self.flakes('import fu; [fu, bar] = 3', m.RedefinedWhileUnused)
 
+    def test_notRedefined(self):
+        self.flakes('''
+        try:
+            import fu
+        except ImportError:
+            import kung as fu
+        ''', m.UnusedImport);
+        self.flakes('''
+        try:
+            import fu
+        except ImportError:
+            fu = None
+        ''');
+
     def test_redefinedByFunction(self):
         self.flakes('''
         import fu


Follow ups