]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42035: Add PyType_GetQualName() to get a type's qualified name. (GH-27551)
authorHai Shi <shihai1992@gmail.com>
Tue, 17 Aug 2021 13:39:34 +0000 (21:39 +0800)
committerGitHub <noreply@github.com>
Tue, 17 Aug 2021 13:39:34 +0000 (15:39 +0200)
Doc/c-api/type.rst
Doc/data/refcounts.dat
Doc/data/stable_abi.dat
Doc/whatsnew/3.11.rst
Include/object.h
Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst [new file with mode: 0644]
Misc/stable_abi.txt
Modules/_testcapimodule.c
Objects/typeobject.c
PC/python3dll.c

index 630c7db437cb408a67c01c7c05d03faaac132396..413294dde779f38d06abc59173c1ebd11a438fc6 100644 (file)
@@ -112,6 +112,13 @@ Type Objects
 
    .. versionadded:: 3.11
 
+.. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type)
+
+   Return the type's qualified name. Equivalent to getting the
+   type's ``__qualname__`` attribute.
+
+   .. versionadded:: 3.11
+
 .. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot)
 
    Return the function pointer stored in the given slot. If the
index 9b5c00599f1e68a53446844e33386c982eded132..3ef1b280e1170883fa6df9431f08b82c21d8f82c 100644 (file)
@@ -2310,6 +2310,9 @@ PyType_GetFlags:PyTypeObject*:type:0:
 PyType_GetName:PyObject*::+1:
 PyType_GetName:PyTypeObject*:type:0:
 
+PyType_GetQualName:PyObject*::+1:
+PyType_GetQualName:PyTypeObject*:type:0:
+
 PyType_GetSlot:void*:::
 PyType_GetSlot:PyTypeObject*:type:0:
 PyType_GetSlot:int:slot::
index 4938459d3174f8a84cc91ce476d5d534b6bd24ee..ea57cc83f7a51099321cf29c593387a4e4097388 100644 (file)
@@ -644,6 +644,7 @@ function,PyType_GetFlags,3.2,
 function,PyType_GetModule,3.10,
 function,PyType_GetModuleState,3.10,
 function,PyType_GetName,3.11,
+function,PyType_GetQualName,3.11,
 function,PyType_GetSlot,3.4,
 function,PyType_IsSubtype,3.2,
 function,PyType_Modified,3.2,
index 88b6f8fa7314e06c2ecd0c67c62c8abfc1849741..c546ec0fc6d9b4cb685188808cef1c48085d3ccf 100644 (file)
@@ -298,6 +298,9 @@ C API Changes
 * Add a new :c:func:`PyType_GetName` function to get type's short name.
   (Contributed by Hai Shi in :issue:`42035`.)
 
+* Add a new :c:func:`PyType_GetQualName` function to get type's qualified name.
+  (Contributed by Hai Shi in :issue:`42035`.)
+
 New Features
 ------------
 
index 23ebad84ab4672fa1f2f7d81e17f41de03106e5a..fb8a63fc7dbe846c0a95706dd0d0d77224f3dbb4 100644 (file)
@@ -241,6 +241,7 @@ PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *);
 #endif
 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030B0000
 PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *);
+PyAPI_FUNC(PyObject *) PyType_GetQualName(PyTypeObject *);
 #endif
 
 /* Generic type check */
diff --git a/Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst b/Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst
new file mode 100644 (file)
index 0000000..4631c43
--- /dev/null
@@ -0,0 +1,2 @@
+Add a new :c:func:`PyType_GetQualName` function to get type's qualified
+name.
index ba16669bd29ba856e1fb002feb3d2f3c9eeb264e..a3ee0f01beccb9365c79b124f19f72b633b894b4 100644 (file)
@@ -2147,6 +2147,8 @@ function PyGC_IsEnabled
 
 function PyType_GetName
     added 3.11
+function PyType_GetQualName
+    added 3.11
 
 # (Detailed comments aren't really needed for further entries: from here on
 #  we can use version control logs.)
index c35eac78ebe880de41cd9add49a9efd4cdd57c02..0a3c6e0b9b27c62a6b7e7369cb6b497a0f0b09ce 100644 (file)
@@ -1159,6 +1159,46 @@ test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
 }
 
 
+static PyObject *
+test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+    PyObject *tp_qualname = PyType_GetQualName(&PyLong_Type);
+    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "int") == 0);
+    Py_DECREF(tp_qualname);
+
+    tp_qualname = PyType_GetQualName(&_PyNamespace_Type);
+    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "SimpleNamespace") == 0);
+    Py_DECREF(tp_qualname);
+
+    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
+    if (HeapTypeNameType == NULL) {
+        Py_RETURN_NONE;
+    }
+    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
+    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "HeapTypeNameType") == 0);
+    Py_DECREF(tp_qualname);
+
+    PyObject *spec_name = PyUnicode_FromString(HeapTypeNameType_Spec.name);
+    if (spec_name == NULL) {
+        goto done;
+    }
+    if (PyObject_SetAttrString(HeapTypeNameType,
+                               "__qualname__", spec_name) < 0) {
+        Py_DECREF(spec_name);
+        goto done;
+    }
+    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
+    assert(strcmp(PyUnicode_AsUTF8(tp_qualname),
+                  "_testcapi.HeapTypeNameType") == 0);
+    Py_DECREF(spec_name);
+    Py_DECREF(tp_qualname);
+
+  done:
+    Py_DECREF(HeapTypeNameType);
+    Py_RETURN_NONE;
+}
+
+
 static PyObject *
 get_args(PyObject *self, PyObject *args)
 {
@@ -5667,6 +5707,7 @@ static PyMethodDef TestMethods[] = {
     {"get_args",                get_args,                        METH_VARARGS},
     {"test_get_statictype_slots", test_get_statictype_slots,     METH_NOARGS},
     {"test_get_type_name",        test_get_type_name,            METH_NOARGS},
+    {"test_get_type_qualname",   test_get_type_qualname,       METH_NOARGS},
     {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
       METH_VARARGS|METH_KEYWORDS},
     {"getargs_tuple",           getargs_tuple,                   METH_VARARGS},
index 1efb9fc5944b024487b907991feb87c767e9a4c2..a38690aed5c8180a1cd5bbdd19a3cc570d0aeb84 100644 (file)
@@ -3620,6 +3620,12 @@ PyType_GetName(PyTypeObject *type)
     return type_name(type, NULL);
 }
 
+PyObject *
+PyType_GetQualName(PyTypeObject *type)
+{
+    return type_qualname(type, NULL);
+}
+
 void *
 PyType_GetSlot(PyTypeObject *type, int slot)
 {
index e0a78294a650e362462aa97510eb8c98542a6af5..2420e53e7052d5eea039feb09a8bd528470878b6 100755 (executable)
@@ -593,6 +593,7 @@ EXPORT_FUNC(PyType_GetFlags)
 EXPORT_FUNC(PyType_GetModule)
 EXPORT_FUNC(PyType_GetModuleState)
 EXPORT_FUNC(PyType_GetName)
+EXPORT_FUNC(PyType_GetQualName)
 EXPORT_FUNC(PyType_GetSlot)
 EXPORT_FUNC(PyType_IsSubtype)
 EXPORT_FUNC(PyType_Modified)