Skip to content

Commit b96582e

Browse files
Optimize clean_duplicates_mro()
1 parent feafcb8 commit b96582e

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

astroid/nodes/scoped_nodes/scoped_nodes.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -133,24 +133,24 @@ def clean_typing_generic_mro(sequences: list[list[ClassDef]]) -> None:
133133
bases_mro.pop(position_in_inferred_bases)
134134

135135

136-
def clean_duplicates_mro(sequences, cls, context):
136+
def clean_duplicates_mro(
137+
sequences: Iterable[Iterable[ClassDef]],
138+
cls: ClassDef,
139+
context: InferenceContext | None,
140+
) -> Iterable[Iterable[ClassDef]]:
137141
for sequence in sequences:
138-
names = [
139-
(node.lineno, node.qname()) if node.name else None for node in sequence
140-
]
141-
last_index = dict(map(reversed, enumerate(names)))
142-
if names and names[0] is not None and last_index[names[0]] != 0:
143-
raise DuplicateBasesError(
144-
message="Duplicates found in MROs {mros} for {cls!r}.",
145-
mros=sequences,
146-
cls=cls,
147-
context=context,
148-
)
149-
yield [
150-
node
151-
for i, (node, name) in enumerate(zip(sequence, names))
152-
if name is None or last_index[name] == i
153-
]
142+
seen = set()
143+
for node in sequence:
144+
lineno_and_qname = (node.lineno, node.qname())
145+
if lineno_and_qname in seen:
146+
raise DuplicateBasesError(
147+
message="Duplicates found in MROs {mros} for {cls!r}.",
148+
mros=sequences,
149+
cls=cls,
150+
context=context,
151+
)
152+
seen.add(lineno_and_qname)
153+
return sequences
154154

155155

156156
def function_to_method(n, klass):
@@ -2825,7 +2825,7 @@ def _compute_mro(self, context: InferenceContext | None = None):
28252825
bases_mro.append(ancestors)
28262826

28272827
unmerged_mro = [[self], *bases_mro, inferred_bases]
2828-
unmerged_mro = list(clean_duplicates_mro(unmerged_mro, self, context))
2828+
unmerged_mro = clean_duplicates_mro(unmerged_mro, self, context)
28292829
clean_typing_generic_mro(unmerged_mro)
28302830
return _c3_merge(unmerged_mro, self, context)
28312831

0 commit comments

Comments
 (0)