Skip to content

Commit d168c23

Browse files
committed
Fix a crash in undefined-variable caused by chained attributes in metaclass
Close #3742
1 parent 17325f2 commit d168c23

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ What's New in Pylint 2.6.1?
2828
===========================
2929
Release date: TBA
3030

31+
* Fix a crash in `undefined-variable` caused by chained attributes in metaclass
32+
33+
Close #3742
34+
3135
* Fix false positive for `not-async-context-manager` when `contextlib.asynccontextmanager` is used
3236

3337
Close #3862

pylint/checkers/variables.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2037,7 +2037,10 @@ def _check_classdef_metaclasses(self, klass, parent_node):
20372037
if isinstance(klass._metaclass, astroid.Name):
20382038
name = klass._metaclass.name
20392039
elif isinstance(klass._metaclass, astroid.Attribute) and klass._metaclass.expr:
2040-
name = klass._metaclass.expr.name
2040+
attr = klass._metaclass.expr
2041+
while not isinstance(attr, astroid.Name):
2042+
attr = attr.expr
2043+
name = attr.name
20412044
elif metaclass:
20422045
name = metaclass.root().name
20432046

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# pylint: disable=import-error,missing-module-docstring,missing-class-docstring,too-few-public-methods
2+
import unknown
3+
4+
5+
class Cls(metaclass=unknown.path.MetaFoo):
6+
pass

0 commit comments

Comments
 (0)