From ab7cc7598a3b8fd3bfb8c21412ac693ba8e9396a Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Tue, 18 Aug 2015 14:30:15 -0400 Subject: [PATCH] Issue #23572: Fixed functools.singledispatch on classes with falsy metaclasses. Patch by Ethan Furman. --- Lib/functools.py | 2 +- Lib/test/test_functools.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Lib/functools.py b/Lib/functools.py index 3e93a3dad4..2c299d7133 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -551,7 +551,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 diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 36f154a7f5..c0d24d8c3e 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -1328,6 +1328,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 diff --git a/Misc/NEWS b/Misc/NEWS index 70c3e1dc05..1a2aebf365 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -392,6 +392,9 @@ Library - Issue #24298: Fix inspect.signature() to correctly unwrap wrappers around bound methods. +- Issue #23572: Fixed functools.singledispatch on classes with falsy + metaclasses. Patch by Ethan Furman. + IDLE ---- -- 2.40.0