From c139ef4107703366d000bb51fbdce3c91a25e43a Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 29 Jul 2017 15:30:54 +0200 Subject: [PATCH] Fix an issue with assigning to __debug__, which is essentially the same as assigning to a keyword. --- parso/python/normalizer.py | 5 +++++ test/test_python_errors.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 09f6416..8e330a4 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -97,6 +97,7 @@ class Context(object): self.node = node self.blocks = [] self.parent_context = parent_context + self.used_names = dict() def is_async_funcdef(self): # Stupidly enough async funcdefs can have two different forms, @@ -387,6 +388,10 @@ class ErrorFinder(Normalizer): self._add_indentation_error(message, spacing) else: self._add_syntax_error('invalid syntax', leaf) + elif leaf.type == 'name': + if leaf.value == '__debug__' and leaf.is_definition(): + message = 'assignment to keyword' + self._add_syntax_error(message, leaf) elif leaf.type == 'string': if 'b' in leaf.string_prefix.lower() \ and any(c for c in leaf.value if ord(c) > 127): diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 943d55b..a1e27bd 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -81,7 +81,8 @@ def test_indentation_errors(code, positions): 'from .__future__ import whatever', 'def f(x=3, y): pass', 'lambda x=3, y: x', - #'__debug__ = 1' + '__debug__ = 1', + 'with x() as __debug__: pass', # Mostly 3.6 relevant '[]: int', '[a, b]: int',