The new function corresponds to the existing (public) PyType_GetName() and PyType_GetQualName().
extern PyObject* _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj,
PyObject *name, int *meth_found);
+
+// This is exported for the _testinternalcapi module.
+PyAPI_FUNC(PyObject *) _PyType_GetModuleName(PyTypeObject *);
+
+
#ifdef __cplusplus
}
#endif
del d.extra
self.assertIsNone(d.extra)
+ def test_get_type_module_name(self):
+ from collections import OrderedDict
+ ht = _testcapi.get_heaptype_for_name()
+ for cls, expected in {
+ int: 'builtins',
+ OrderedDict: 'collections',
+ ht: '_testcapi',
+ }.items():
+ with self.subTest(repr(cls)):
+ modname = _testinternalcapi.get_type_module_name(cls)
+ self.assertEqual(modname, expected)
+
+ ht.__module__ = 'test_module'
+ modname = _testinternalcapi.get_type_module_name(ht)
+ self.assertEqual(modname, 'test_module')
@requires_limited_api
class TestHeapTypeRelative(unittest.TestCase):
.slots = HeapTypeNameType_slots,
};
+static PyObject *
+get_heaptype_for_name(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ return PyType_FromSpec(&HeapTypeNameType_Spec);
+}
+
static PyObject *
test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
{
{"py_buildvalue_ints", py_buildvalue_ints, METH_VARARGS},
{"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
{"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
+ {"get_heaptype_for_name", get_heaptype_for_name, METH_NOARGS},
{"test_get_type_name", test_get_type_name, METH_NOARGS},
{"test_get_type_qualname", test_get_type_qualname, METH_NOARGS},
{"test_get_type_dict", test_get_type_dict, METH_NOARGS},
#include "pycore_pathconfig.h" // _PyPathConfig_ClearGlobal()
#include "pycore_pyerrors.h" // _PyErr_ChainExceptions1()
#include "pycore_pystate.h" // _PyThreadState_GET()
+#include "pycore_typeobject.h" // _PyType_GetModuleName()
#include "interpreteridobject.h" // PyInterpreterID_LookUp()
}
+static PyObject *
+get_type_module_name(PyObject *self, PyObject *type)
+{
+ assert(PyType_Check(type));
+ return _PyType_GetModuleName((PyTypeObject *)type);
+}
+
+
static PyMethodDef module_functions[] = {
{"get_configs", get_configs, METH_NOARGS},
{"get_recursion_depth", get_recursion_depth, METH_NOARGS},
{"get_crossinterp_data", get_crossinterp_data, METH_VARARGS},
{"restore_crossinterp_data", restore_crossinterp_data, METH_VARARGS},
_TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF
+ {"get_type_module_name", get_type_module_name, METH_O},
{NULL, NULL} /* sentinel */
};
return type_qualname(type, NULL);
}
+PyObject *
+_PyType_GetModuleName(PyTypeObject *type)
+{
+ return type_module(type, NULL);
+}
+
void *
PyType_GetSlot(PyTypeObject *type, int slot)
{