Skip to content

Commit b1b067e

Browse files
RogdhamPierre-Sassoulas
authored andcommitted
Fix used-before-assignment for functions/classes defined in type checking guard
Close #7368
1 parent 646fef2 commit b1b067e

File tree

4 files changed

+28
-12
lines changed

4 files changed

+28
-12
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix ``used-before-assignment`` for functions/classes defined in type checking guard.
2+
3+
Closes #7368

pylint/checkers/variables.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,7 +1841,6 @@ def _is_variable_violation(
18411841
base_scope_type,
18421842
is_recursive_klass,
18431843
) -> tuple[bool, bool, bool]:
1844-
# pylint: disable=too-many-nested-blocks
18451844
maybe_before_assign = True
18461845
annotation_return = False
18471846
use_outer_definition = False
@@ -2014,8 +2013,13 @@ def _is_variable_violation(
20142013
for target in definition.targets
20152014
if isinstance(target, nodes.AssignName)
20162015
)
2017-
if defined_in_or_else:
2018-
break
2016+
elif isinstance(
2017+
definition, (nodes.ClassDef, nodes.FunctionDef)
2018+
):
2019+
defined_in_or_else = definition.name == node.name
2020+
2021+
if defined_in_or_else:
2022+
break
20192023

20202024
if not used_in_branch and not defined_in_or_else:
20212025
maybe_before_assign = True

tests/functional/u/undefined/undefined_variable.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,24 @@ def func_should_fail(_dt: datetime): # [used-before-assignment]
267267
if TYPE_CHECKING:
268268
from collections import Counter
269269
from collections import OrderedDict
270+
from collections import defaultdict
271+
from collections import UserDict
270272
else:
271273
Counter = object
272274
OrderedDict = object
275+
def defaultdict():
276+
return {}
277+
class UserDict(dict):
278+
pass
273279

274280

275281
def tick(counter: Counter, name: str, dictionary: OrderedDict) -> OrderedDict:
276282
counter[name] += 1
277283
return dictionary
278284

285+
defaultdict()
286+
287+
UserDict()
279288

280289
# pylint: disable=unused-argument
281290
def not_using_loop_variable_accordingly(iterator):

tests/functional/u/undefined/undefined_variable.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ undefined-variable:171:4:171:13::Undefined variable 'unicode_3':UNDEFINED
2828
undefined-variable:226:25:226:37:LambdaClass4.<lambda>:Undefined variable 'LambdaClass4':UNDEFINED
2929
undefined-variable:234:25:234:37:LambdaClass5.<lambda>:Undefined variable 'LambdaClass5':UNDEFINED
3030
used-before-assignment:255:26:255:34:func_should_fail:Using variable 'datetime' before assignment:HIGH
31-
undefined-variable:282:18:282:24:not_using_loop_variable_accordingly:Undefined variable 'iteree':UNDEFINED
32-
undefined-variable:299:27:299:28:undefined_annotation:Undefined variable 'x':UNDEFINED
33-
used-before-assignment:300:7:300:8:undefined_annotation:Using variable 'x' before assignment:HIGH
34-
undefined-variable:330:11:330:12:decorated3:Undefined variable 'x':UNDEFINED
35-
undefined-variable:335:19:335:20:decorated4:Undefined variable 'y':UNDEFINED
36-
undefined-variable:356:10:356:20:global_var_mixed_assignment:Undefined variable 'GLOBAL_VAR':HIGH
37-
undefined-variable:368:19:368:44:RepeatedReturnAnnotations.x:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
38-
undefined-variable:370:19:370:44:RepeatedReturnAnnotations.y:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
39-
undefined-variable:372:19:372:44:RepeatedReturnAnnotations.z:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
31+
undefined-variable:291:18:291:24:not_using_loop_variable_accordingly:Undefined variable 'iteree':UNDEFINED
32+
undefined-variable:308:27:308:28:undefined_annotation:Undefined variable 'x':UNDEFINED
33+
used-before-assignment:309:7:309:8:undefined_annotation:Using variable 'x' before assignment:HIGH
34+
undefined-variable:339:11:339:12:decorated3:Undefined variable 'x':UNDEFINED
35+
undefined-variable:344:19:344:20:decorated4:Undefined variable 'y':UNDEFINED
36+
undefined-variable:365:10:365:20:global_var_mixed_assignment:Undefined variable 'GLOBAL_VAR':HIGH
37+
undefined-variable:377:19:377:44:RepeatedReturnAnnotations.x:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
38+
undefined-variable:379:19:379:44:RepeatedReturnAnnotations.y:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
39+
undefined-variable:381:19:381:44:RepeatedReturnAnnotations.z:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED

0 commit comments

Comments
 (0)