From 43541ee1dd394ec4691625e7295f701b3b073dca Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 5 Jan 2021 08:04:38 -0800 Subject: [PATCH] Fix annotation clobbering __all__ (#606) --- pyflakes/checker.py | 5 ++++- pyflakes/test/test_type_annotations.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pyflakes/checker.py b/pyflakes/checker.py index 38f8f73a..215bd314 100644 --- a/pyflakes/checker.py +++ b/pyflakes/checker.py @@ -1140,7 +1140,10 @@ def addBinding(self, node, value): # then assume the rebound name is used as a global or within a loop value.used = self.scope[value.name].used - self.scope[value.name] = value + # don't treat annotations as assignments if there is an existing value + # in scope + if value.name not in self.scope or not isinstance(value, Annotation): + self.scope[value.name] = value def _unknown_handler(self, node): # this environment variable configures whether to error on unknown diff --git a/pyflakes/test/test_type_annotations.py b/pyflakes/test/test_type_annotations.py index 409238b8..835d8d9f 100644 --- a/pyflakes/test/test_type_annotations.py +++ b/pyflakes/test/test_type_annotations.py @@ -335,6 +335,19 @@ def f(t: T): pass def g(t: 'T'): pass ''') + @skipIf(version_info < (3, 6), 'new in Python 3.6') + def test_type_annotation_clobbers_all(self): + self.flakes('''\ + from typing import TYPE_CHECKING, List + + from y import z + + if not TYPE_CHECKING: + __all__ = ("z",) + else: + __all__: List[str] + ''') + def test_typeCommentsMarkImportsAsUsed(self): self.flakes(""" from mod import A, B, C, D, E, F, G