diff -r ec4b0145f7e5 Lib/functools.py --- a/Lib/functools.py Mon Jun 17 15:45:11 2013 +0200 +++ b/Lib/functools.py Wed Jun 19 09:08:16 2013 +0100 @@ -376,14 +376,18 @@ if (needle in bases or not hasattr(needle, '__mro__') or not issubclass(cls, needle)): continue # either present in the __mro__ already or unrelated - for index, base in enumerate(mro): - if not issubclass(base, needle): + for i, base in enumerate(mro): + if issubclass(base, needle): + index = i + 1 + elif base in bases: break - if base in bases and not issubclass(needle, base): + if not issubclass(needle, base): # Conflict resolution: put classes present in __mro__ and their # subclasses first. See test_mro_conflicts() in test_functools.py # for examples. - index += 1 + for index, base in enumerate(mro[i + 1:], i + 1): + if not issubclass(base, needle): + break mro.insert(index, needle) return mro diff -r ec4b0145f7e5 Lib/test/test_functools.py --- a/Lib/test/test_functools.py Mon Jun 17 15:45:11 2013 +0200 +++ b/Lib/test/test_functools.py Wed Jun 19 09:08:16 2013 +0100 @@ -940,6 +940,15 @@ m = mro(c.ChainMap, haystack) self.assertEqual(m, [c.ChainMap, c.MutableMapping, c.Mapping, c.Sized, c.Iterable, c.Container, object]) + class C(c.defaultdict): + pass + c.MutableSequence.register(C) + bases = [c.MutableSequence, c.Sequence, c.MutableMapping, c.Mapping] + for haystack in permutations(bases): + m = mro(C, haystack) + self.assertEqual(m, [C, c.defaultdict, c.MutableSequence, c.Sequence, + dict, c.MutableMapping, c.Mapping, object]) + # Note: The MRO order below depends on haystack ordering. m = mro(c.defaultdict, [c.Sized, c.Container, str]) self.assertEqual(m, [c.defaultdict, dict, c.Container, c.Sized, object])