@@ -133,24 +133,24 @@ def clean_typing_generic_mro(sequences: list[list[ClassDef]]) -> None:
133
133
bases_mro .pop (position_in_inferred_bases )
134
134
135
135
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 ]]:
137
141
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
154
154
155
155
156
156
def function_to_method (n , klass ):
@@ -2825,7 +2825,7 @@ def _compute_mro(self, context: InferenceContext | None = None):
2825
2825
bases_mro .append (ancestors )
2826
2826
2827
2827
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 )
2829
2829
clean_typing_generic_mro (unmerged_mro )
2830
2830
return _c3_merge (unmerged_mro , self , context )
2831
2831
0 commit comments