Skip to content

Commit 4feb31f

Browse files
committed
Fix global removing all UndefinedName
03ffc76 introduced better global support, however a logic error caused it to remove any previously detected UndefinedName whenever a global was encountered.
1 parent 9a4d45c commit 4feb31f

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

pyflakes/checker.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,10 +693,12 @@ def GLOBAL(self, node):
693693
node_value = Assignment(node_name, node)
694694

695695
# Remove UndefinedName messages already reported for this name.
696+
# TODO: if the global is not used in this scope, it does not
697+
# become a globally defined name. See test_unused_global.
696698
self.messages = [
697699
m for m in self.messages if not
698-
isinstance(m, messages.UndefinedName) and not
699-
m.message_args[0] == node_name]
700+
isinstance(m, messages.UndefinedName) or
701+
m.message_args[0] != node_name]
700702

701703
# Bind name to global scope if it doesn't exist already.
702704
global_scope.setdefault(node_name, node_value)

pyflakes/test/test_undefined_names.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sys import version_info
44

55
from pyflakes import messages as m, checker
6-
from pyflakes.test.harness import TestCase, skipIf
6+
from pyflakes.test.harness import TestCase, skipIf, skip
77

88

99
class Test(TestCase):
@@ -125,6 +125,29 @@ def foo():
125125
print(x)
126126
''', m.UndefinedName)
127127

128+
def test_global_reset_name_only(self):
129+
"""A global statement does not prevent other names being undefined."""
130+
# Only different undefined names are reported.
131+
# See following test that fails where the same name is used.
132+
self.flakes('''
133+
def f1():
134+
s
135+
136+
def f2():
137+
global m
138+
''', m.UndefinedName)
139+
140+
@skip("todo")
141+
def test_unused_global(self):
142+
"""An unused global statement does not define the name."""
143+
self.flakes('''
144+
def f1():
145+
m
146+
147+
def f2():
148+
global m
149+
''', m.UndefinedName)
150+
128151
def test_del(self):
129152
"""Del deletes bindings."""
130153
self.flakes('a = 1; del a; a', m.UndefinedName)

0 commit comments

Comments
 (0)