allow any type with __getitem__ to be a mapping for the purposes of % (#15801)
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 7871323..1209197 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -4257,8 +4257,8 @@
         arglen = -1;
         argidx = -2;
     }
-    if (PyMapping_Check(args) && !PyTuple_Check(args) &&
-        !PyObject_TypeCheck(args, &PyBaseString_Type))
+    if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
+        !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type))
         dict = args;
     while (--fmtcnt >= 0) {
         if (*fmt != '%') {
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 981a98b..0ead06f 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -8287,8 +8287,8 @@
         arglen = -1;
         argidx = -2;
     }
-    if (PyMapping_Check(args) && !PyTuple_Check(args) &&
-        !PyObject_TypeCheck(args, &PyBaseString_Type))
+    if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
+        !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type))
         dict = args;
 
     while (--fmtcnt >= 0) {