summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2024-03-14 16:19:36 (GMT)
committerGitHub <noreply@github.com>2024-03-14 16:19:36 (GMT)
commit19c3a2ff91ccf7444efadbc8f7e67269060050a2 (patch)
treea6e7d0e2710d66c585c7ffe4451eee85710d8ba7 /Objects
parentb54d7c87aaf23fbd67171d0dd3e4f4ab736e6a48 (diff)
downloadcpython-19c3a2ff91ccf7444efadbc8f7e67269060050a2.zip
cpython-19c3a2ff91ccf7444efadbc8f7e67269060050a2.tar.gz
cpython-19c3a2ff91ccf7444efadbc8f7e67269060050a2.tar.bz2
gh-111696, PEP 737: Add PyType_GetFullyQualifiedName() function (#116815)
Rewrite tests on type names in Python, they were written in C.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c62
1 files changed, 50 insertions, 12 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index d8c3e92..e51adac 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -1201,6 +1201,41 @@ type_set_module(PyTypeObject *type, PyObject *value, void *context)
return PyDict_SetItem(dict, &_Py_ID(__module__), value);
}
+
+PyObject *
+PyType_GetFullyQualifiedName(PyTypeObject *type)
+{
+ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ return PyUnicode_FromString(type->tp_name);
+ }
+
+ PyObject *qualname = type_qualname(type, NULL);
+ if (qualname == NULL) {
+ return NULL;
+ }
+
+ PyObject *module = type_module(type, NULL);
+ if (module == NULL) {
+ Py_DECREF(qualname);
+ return NULL;
+ }
+
+ PyObject *result;
+ if (PyUnicode_Check(module)
+ && !_PyUnicode_Equal(module, &_Py_ID(builtins))
+ && !_PyUnicode_Equal(module, &_Py_ID(__main__)))
+ {
+ result = PyUnicode_FromFormat("%U.%U", module, qualname);
+ }
+ else {
+ result = Py_NewRef(qualname);
+ }
+ Py_DECREF(module);
+ Py_DECREF(qualname);
+ return result;
+}
+
+
static PyObject *
type_abstractmethods(PyTypeObject *type, void *context)
{
@@ -1708,28 +1743,31 @@ type_repr(PyObject *self)
return PyUnicode_FromFormat("<class at %p>", type);
}
- PyObject *mod, *name, *rtn;
-
- mod = type_module(type, NULL);
- if (mod == NULL)
+ PyObject *mod = type_module(type, NULL);
+ if (mod == NULL) {
PyErr_Clear();
+ }
else if (!PyUnicode_Check(mod)) {
- Py_SETREF(mod, NULL);
+ Py_CLEAR(mod);
}
- name = type_qualname(type, NULL);
+
+ PyObject *name = type_qualname(type, NULL);
if (name == NULL) {
Py_XDECREF(mod);
return NULL;
}
- if (mod != NULL && !_PyUnicode_Equal(mod, &_Py_ID(builtins)))
- rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
- else
- rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
-
+ PyObject *result;
+ if (mod != NULL && !_PyUnicode_Equal(mod, &_Py_ID(builtins))) {
+ result = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
+ }
+ else {
+ result = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
+ }
Py_XDECREF(mod);
Py_DECREF(name);
- return rtn;
+
+ return result;
}
static PyObject *