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

Patch by Ethan Furman.
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 36f154a..c0d24d8c 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -1328,6 +1328,24 @@
         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