Issue #23572: Fixed functools.singledispatch on classes with falsy metaclasses.

Patch by Ethan Furman.
This commit is contained in:
Yury Selivanov 2015-08-18 14:20:00 -04:00
parent f5e0c41d6d
commit 77a8cd65be
3 changed files with 42 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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?
===============================================