summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Vandenberg <jayvdb@gmail.com>2015-11-12 17:46:04 +1100
committerJohn Vandenberg <jayvdb@gmail.com>2015-11-12 18:13:18 +1100
commit4feb31f04e4748bb131c58502175a1cc3bf5a19a (patch)
treea6be230a30f18a87d3eb49be844acdd2f68571e7
parent9a4d45c12e86cbb9effd749bd13ba48927063c23 (diff)
downloadpyflakes-4feb31f04e4748bb131c58502175a1cc3bf5a19a.tar.gz
Fix global removing all UndefinedName
03ffc763 introduced better global support, however a logic error caused it to remove any previously detected UndefinedName whenever a global was encountered.
-rw-r--r--pyflakes/checker.py6
-rw-r--r--pyflakes/test/test_undefined_names.py25
2 files changed, 28 insertions, 3 deletions
diff --git a/pyflakes/checker.py b/pyflakes/checker.py
index 80f26ee..f3f8a46 100644
--- a/pyflakes/checker.py
+++ b/pyflakes/checker.py
@@ -693,10 +693,12 @@ class Checker(object):
node_value = Assignment(node_name, node)
# Remove UndefinedName messages already reported for this name.
+ # TODO: if the global is not used in this scope, it does not
+ # become a globally defined name. See test_unused_global.
self.messages = [
m for m in self.messages if not
- isinstance(m, messages.UndefinedName) and not
- m.message_args[0] == node_name]
+ isinstance(m, messages.UndefinedName) or
+ m.message_args[0] != node_name]
# Bind name to global scope if it doesn't exist already.
global_scope.setdefault(node_name, node_value)
diff --git a/pyflakes/test/test_undefined_names.py b/pyflakes/test/test_undefined_names.py
index faaaf8c..bb50f2c 100644
--- a/pyflakes/test/test_undefined_names.py
+++ b/pyflakes/test/test_undefined_names.py
@@ -3,7 +3,7 @@ from _ast import PyCF_ONLY_AST
from sys import version_info
from pyflakes import messages as m, checker
-from pyflakes.test.harness import TestCase, skipIf
+from pyflakes.test.harness import TestCase, skipIf, skip
class Test(TestCase):
@@ -125,6 +125,29 @@ class Test(TestCase):
print(x)
''', m.UndefinedName)
+ def test_global_reset_name_only(self):
+ """A global statement does not prevent other names being undefined."""
+ # Only different undefined names are reported.
+ # See following test that fails where the same name is used.
+ self.flakes('''
+ def f1():
+ s
+
+ def f2():
+ global m
+ ''', m.UndefinedName)
+
+ @skip("todo")
+ def test_unused_global(self):
+ """An unused global statement does not define the name."""
+ self.flakes('''
+ def f1():
+ m
+
+ def f2():
+ global m
+ ''', m.UndefinedName)
+
def test_del(self):
"""Del deletes bindings."""
self.flakes('a = 1; del a; a', m.UndefinedName)