divmod-dev team mailing list archive
-
divmod-dev team
-
Mailing list archive
-
Message #00327
[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