Path 1: 1411 calls (0.95)

ClassDef (1411)

Module (1361) FunctionDef (50)

[] (1411)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 2: 44 calls (0.03)

ClassDef (44)

Module (43) FunctionDef (1)

list (44)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 3: 14 calls (0.01)

ClassDef (14)

Module (14)

[] (14)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 4: 4 calls (0.0)

ClassDef (4)

FunctionDef (4)

list (4)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 5: 3 calls (0.0)

ClassDef (3)

Module (3)

list (3)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 6: 2 calls (0.0)

ClassDef (2)

FunctionDef (1) Module (1)

list (2)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 7: 2 calls (0.0)

ClassDef (2)

Module (2)

[] (2)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 8: 2 calls (0.0)

ClassDef (2)

Module (2)

[] (2)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 9: 2 calls (0.0)

ClassDef (2)

Module (2)

[] (2)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 10: 2 calls (0.0)

ClassDef (2)

Module (2)

[] (2)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 11: 1 calls (0.0)

ClassDef (1)

Module (1)

[] (1)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 12: 1 calls (0.0)

ClassDef (1)

Module (1)

list (1)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 13: 1 calls (0.0)

ClassDef (1)

Module (1)

[] (1)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed
            

Path 14: 1 calls (0.0)

ClassDef (1)

Module (1)

[] (1)

1def _check_classdef_metaclasses(
2        self, klass: nodes.ClassDef, parent_node: nodes.Module | nodes.FunctionDef
3    ) -> list[tuple[dict[str, list[nodes.NodeNG]], str]]:
4        if not klass._metaclass:
5            # Skip if this class doesn't use explicitly a metaclass, but inherits it from ancestors
6            return []
7
8        consumed: list[tuple[dict[str, list[nodes.NodeNG]], str]] = []
9        metaclass = klass.metaclass()
10        name = ""
11        if isinstance(klass._metaclass, nodes.Name):
12            name = klass._metaclass.name
13        elif isinstance(klass._metaclass, nodes.Attribute) and klass._metaclass.expr:
14            attr = klass._metaclass.expr
15            while not isinstance(attr, nodes.Name):
16                attr = attr.expr
17            name = attr.name
18        elif isinstance(klass._metaclass, nodes.Call) and isinstance(
19            klass._metaclass.func, nodes.Name
20        ):
21            name = klass._metaclass.func.name
22        elif metaclass:
23            name = metaclass.root().name
24
25        found = False
26        name = METACLASS_NAME_TRANSFORMS.get(name, name)
27        if name:
28            # check enclosing scopes starting from most local
29            for scope_locals, _, _, _ in self._to_consume[::-1]:
30                found_nodes = scope_locals.get(name, [])
31                for found_node in found_nodes:
32                    if found_node.lineno <= klass.lineno:
33                        consumed.append((scope_locals, name))
34                        found = True
35                        break
36            # Check parent scope
37            nodes_in_parent_scope = parent_node.locals.get(name, [])
38            for found_node_parent in nodes_in_parent_scope:
39                if found_node_parent.lineno <= klass.lineno:
40                    found = True
41                    break
42        if (
43            not found
44            and not metaclass
45            and not (
46                name in nodes.Module.scope_attrs
47                or utils.is_builtin(name)
48                or name in self.linter.config.additional_builtins
49            )
50        ):
51            self.add_message("undefined-variable", node=klass, args=(name,))
52
53        return consumed