]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42035: Add a PyType_GetName() to get type's short name. (GH-23903)
authorHai Shi <shihai1992@gmail.com>
Thu, 29 Jul 2021 07:57:02 +0000 (15:57 +0800)
committerGitHub <noreply@github.com>
Thu, 29 Jul 2021 07:57:02 +0000 (09:57 +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/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst [new file with mode: 0644]
Misc/stable_abi.txt
Modules/_testcapimodule.c
Objects/typeobject.c
PC/python3dll.c

index 7a677593d073d5eb61475572faa95bceed3ae6bb..46cb3768fcee4d5574b070b1c26e49dda7a19cb1 100644 (file)
@@ -106,6 +106,12 @@ Type Objects
        GC protocol itself by at least implementing the
        :c:member:`~PyTypeObject.tp_traverse` handle.
 
+.. c:function:: PyObject* PyType_GetName(PyTypeObject *type)
+
+   Return the type's name. Equivalent to getting the type's ``__name__`` 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 22dae0c1ef1afd6b09060e3feedc70c1171c2f38..8fd6c7bc7a2bc349a295ac05389281f25d0574d0 100644 (file)
@@ -2289,6 +2289,9 @@ PyType_GenericNew:PyObject*:kwds:0:
 PyType_GetFlags:unsigned long:::
 PyType_GetFlags:PyTypeObject*:type:0:
 
+PyType_GetName:PyObject*::+1:
+PyType_GetName:PyTypeObject*:type:0:
+
 PyType_GetSlot:void*:::
 PyType_GetSlot:PyTypeObject*:type:0:
 PyType_GetSlot:int:slot::
index e373e2314a65171e688ff685c50571adf56bf89b..c7dde01340a32a67def4146e9752887de42ac1d3 100644 (file)
@@ -639,6 +639,7 @@ function,PyType_GenericNew,3.2,
 function,PyType_GetFlags,3.2,
 function,PyType_GetModule,3.10,
 function,PyType_GetModuleState,3.10,
+function,PyType_GetName,3.11,
 function,PyType_GetSlot,3.4,
 function,PyType_IsSubtype,3.2,
 function,PyType_Modified,3.2,
index e97162a17dbdc610e114f63ae782d1a86d18837f..88b6f8fa7314e06c2ecd0c67c62c8abfc1849741 100644 (file)
@@ -295,6 +295,8 @@ Changes in the Python API
 
 C API Changes
 =============
+* Add a new :c:func:`PyType_GetName` function to get type's short name.
+  (Contributed by Hai Shi in :issue:`42035`.)
 
 New Features
 ------------
index 9e6a8f4656af0e687e259e94cb439727cfa98ab5..23ebad84ab4672fa1f2f7d81e17f41de03106e5a 100644 (file)
@@ -239,6 +239,9 @@ PyAPI_FUNC(PyObject*) PyType_FromModuleAndSpec(PyObject *, PyType_Spec *, PyObje
 PyAPI_FUNC(PyObject *) PyType_GetModule(struct _typeobject *);
 PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *);
 #endif
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030B0000
+PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *);
+#endif
 
 /* Generic type check */
 PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *);
diff --git a/Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst b/Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst
new file mode 100644 (file)
index 0000000..8adb20e
--- /dev/null
@@ -0,0 +1 @@
+Add a new :c:func:`PyType_GetName` function to get type's short name.
index f104f84e451da11bc53c2faffe943ed2d5b3f136..62c0cdcc5d43b4bb858e72e41711bd78069de9db 100644 (file)
@@ -2132,6 +2132,10 @@ function PyGC_Enable
 function PyGC_IsEnabled
     added 3.10
 
+# Add new C API in Python 3.11
+
+function PyType_GetName
+    added 3.11
 
 # (Detailed comments aren't really needed for further entries: from here on
 #  we can use version control logs.)
index 7ac0e84d2efb0d0aa3b33cc50c8875d1ab642f7a..f338e89f426da0da09dc66352703148cc1c01609 100644 (file)
@@ -37,6 +37,7 @@
 #endif
 
 static struct PyModuleDef _testcapimodule;
+static PyType_Spec HeapTypeNameType_Spec;
 
 static PyObject *TestError;     /* set to exception object in init */
 
@@ -1134,6 +1135,30 @@ test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
 }
 
 
+static PyObject *
+test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+    PyObject *tp_name = PyType_GetName(&PyLong_Type);
+    assert(strcmp(PyUnicode_AsUTF8(tp_name), "int") == 0);
+    Py_DECREF(tp_name);
+
+    tp_name = PyType_GetName(&PyModule_Type);
+    assert(strcmp(PyUnicode_AsUTF8(tp_name), "module") == 0);
+    Py_DECREF(tp_name);
+
+    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
+    if (HeapTypeNameType == NULL) {
+        Py_RETURN_NONE;
+    }
+    tp_name = PyType_GetName((PyTypeObject *)HeapTypeNameType);
+    assert(strcmp(PyUnicode_AsUTF8(tp_name), "HeapTypeNameType") == 0);
+    Py_DECREF(tp_name);
+
+    Py_DECREF(HeapTypeNameType);
+    Py_RETURN_NONE;
+}
+
+
 static PyObject *
 get_args(PyObject *self, PyObject *args)
 {
@@ -5624,6 +5649,7 @@ static PyMethodDef TestMethods[] = {
     {"test_buildvalue_issue38913", test_buildvalue_issue38913,   METH_NOARGS},
     {"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},
     {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
       METH_VARARGS|METH_KEYWORDS},
     {"getargs_tuple",           getargs_tuple,                   METH_VARARGS},
@@ -6512,6 +6538,21 @@ static PyType_Spec HeapDocCType_spec = {
     HeapDocCType_slots
 };
 
+typedef struct {
+    PyObject_HEAD
+} HeapTypeNameObject;
+
+static PyType_Slot HeapTypeNameType_slots[] = {
+    {0},
+};
+
+static PyType_Spec HeapTypeNameType_Spec = {
+    .name = "_testcapi.HeapTypeNameType",
+    .basicsize = sizeof(HeapTypeNameObject),
+    .flags = Py_TPFLAGS_DEFAULT,
+    .slots = HeapTypeNameType_slots,
+};
+
 typedef struct {
     PyObject_HEAD
 } NullTpDocTypeObject;
index 43b4d0725a4146e51261e3fb7c3aaf1b63ef5b88..2240f780bb9cebd82292466d253c64afeaf3b50f 100644 (file)
@@ -3628,6 +3628,12 @@ PyType_FromSpec(PyType_Spec *spec)
     return PyType_FromSpecWithBases(spec, NULL);
 }
 
+PyObject *
+PyType_GetName(PyTypeObject *type)
+{
+    return type_name(type, NULL);
+}
+
 void *
 PyType_GetSlot(PyTypeObject *type, int slot)
 {
index 0ebb56efaecb2c9f2edf5166ca4f82620c4a04aa..1659e9fc64f5cb669e813a3531bdaf7c56bf0cab 100755 (executable)
@@ -588,6 +588,7 @@ EXPORT_FUNC(PyType_GenericNew)
 EXPORT_FUNC(PyType_GetFlags)
 EXPORT_FUNC(PyType_GetModule)
 EXPORT_FUNC(PyType_GetModuleState)
+EXPORT_FUNC(PyType_GetName)
 EXPORT_FUNC(PyType_GetSlot)
 EXPORT_FUNC(PyType_IsSubtype)
 EXPORT_FUNC(PyType_Modified)