Skip to content

Commit fb6be59

Browse files
DanielNoordPierre-Sassoulas
authored andcommitted
Fix undefined-variable for __class__ in inner methods (#6957)
1 parent b9ecb4d commit fb6be59

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

doc/whatsnew/2/2.14/full.rst

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ Release date: TBA
1010

1111
Closes #2270
1212

13+
* Fixed false positive for ``undefined-variable`` for ``__class__`` in inner methods.
14+
15+
Closes #4032
16+
17+
1318
What's New in Pylint 2.14.2?
1419
----------------------------
1520
Release date: 2022-06-15

pylint/checkers/variables.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1419,8 +1419,11 @@ def _undefined_and_used_before_checker(
14191419
or node.name in self.linter.config.additional_builtins
14201420
or (
14211421
node.name == "__class__"
1422-
and isinstance(frame, nodes.FunctionDef)
1423-
and frame.is_method()
1422+
and any(
1423+
i.is_method()
1424+
for i in node.node_ancestors()
1425+
if isinstance(i, nodes.FunctionDef)
1426+
)
14241427
)
14251428
)
14261429
and not utils.node_ignores_exception(node, NameError)

tests/functional/u/undefined/undefined_variable.py

+6
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,12 @@ def method(self):
291291
# This name is not defined in the AST but it's present at runtime
292292
return __class__
293293

294+
# It is also present in inner methods
295+
def method_two(self):
296+
def inner_method():
297+
return __class__
298+
299+
inner_method()
294300

295301
def undefined_annotation(a:x): # [undefined-variable]
296302
if x == 2: # [used-before-assignment]

tests/functional/u/undefined/undefined_variable.txt

+8-8
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ undefined-variable:228:25:228:37:LambdaClass4.<lambda>:Undefined variable 'Lambd
2929
undefined-variable:236:25:236:37:LambdaClass5.<lambda>:Undefined variable 'LambdaClass5':UNDEFINED
3030
used-before-assignment:257:26:257:34:func_should_fail:Using variable 'datetime' before assignment:HIGH
3131
undefined-variable:284:18:284:24:not_using_loop_variable_accordingly:Undefined variable 'iteree':UNDEFINED
32-
undefined-variable:295:27:295:28:undefined_annotation:Undefined variable 'x':UNDEFINED
33-
used-before-assignment:296:7:296:8:undefined_annotation:Using variable 'x' before assignment:HIGH
34-
undefined-variable:326:11:326:12:decorated3:Undefined variable 'x':UNDEFINED
35-
undefined-variable:331:19:331:20:decorated4:Undefined variable 'y':UNDEFINED
36-
undefined-variable:352:10:352:20:global_var_mixed_assignment:Undefined variable 'GLOBAL_VAR':HIGH
37-
undefined-variable:364:19:364:44:RepeatedReturnAnnotations.x:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
38-
undefined-variable:366:19:366:44:RepeatedReturnAnnotations.y:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
39-
undefined-variable:368:19:368:44:RepeatedReturnAnnotations.z:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
32+
undefined-variable:301:27:301:28:undefined_annotation:Undefined variable 'x':UNDEFINED
33+
used-before-assignment:302:7:302:8:undefined_annotation:Using variable 'x' before assignment:HIGH
34+
undefined-variable:332:11:332:12:decorated3:Undefined variable 'x':UNDEFINED
35+
undefined-variable:337:19:337:20:decorated4:Undefined variable 'y':UNDEFINED
36+
undefined-variable:358:10:358:20:global_var_mixed_assignment:Undefined variable 'GLOBAL_VAR':HIGH
37+
undefined-variable:370:19:370:44:RepeatedReturnAnnotations.x:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
38+
undefined-variable:372:19:372:44:RepeatedReturnAnnotations.y:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED
39+
undefined-variable:374:19:374:44:RepeatedReturnAnnotations.z:Undefined variable 'RepeatedReturnAnnotations':UNDEFINED

0 commit comments

Comments
 (0)