mirror of https://github.com/python/cpython
Issue #23572: Fixed functools.singledispatch on classes with falsy metaclasses.
Patch by Ethan Furman.
This commit is contained in:
parent
f5e0c41d6d
commit
77a8cd65be
|
@ -567,7 +567,7 @@ def _c3_merge(sequences):
|
|||
break # reject the current head, it appears later
|
||||
else:
|
||||
break
|
||||
if not candidate:
|
||||
if candidate is None:
|
||||
raise RuntimeError("Inconsistent hierarchy")
|
||||
result.append(candidate)
|
||||
# remove the chosen candidate
|
||||
|
|
|
@ -1491,6 +1491,24 @@ class TestSingleDispatch(unittest.TestCase):
|
|||
many_abcs = [c.Mapping, c.Sized, c.Callable, c.Container, c.Iterable]
|
||||
self.assertEqual(mro(X, abcs=many_abcs), expected)
|
||||
|
||||
def test_false_meta(self):
|
||||
# see issue23572
|
||||
class MetaA(type):
|
||||
def __len__(self):
|
||||
return 0
|
||||
class A(metaclass=MetaA):
|
||||
pass
|
||||
class AA(A):
|
||||
pass
|
||||
@functools.singledispatch
|
||||
def fun(a):
|
||||
return 'base A'
|
||||
@fun.register(A)
|
||||
def _(a):
|
||||
return 'fun A'
|
||||
aa = AA()
|
||||
self.assertEqual(fun(aa), 'fun A')
|
||||
|
||||
def test_mro_conflicts(self):
|
||||
c = collections
|
||||
@functools.singledispatch
|
||||
|
|
23
Misc/NEWS
23
Misc/NEWS
|
@ -2,6 +2,29 @@
|
|||
Python News
|
||||
+++++++++++
|
||||
|
||||
|
||||
What's New in Python 3.5.1
|
||||
==========================
|
||||
|
||||
|
||||
Release date: TBA
|
||||
|
||||
|
||||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
|
||||
Library
|
||||
-------
|
||||
|
||||
- Issue #23572: Fixed functools.singledispatch on classes with falsy
|
||||
metaclasses. Patch by Ethan Furman.
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
|
||||
What's New in Python 3.5.0 release candidate 2?
|
||||
===============================================
|
||||
|
||||
|
|
Loading…
Reference in New Issue