diff options
author | Victor Stinner <vstinner@python.org> | 2024-03-14 16:19:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-14 16:19:36 (GMT) |
commit | 19c3a2ff91ccf7444efadbc8f7e67269060050a2 (patch) | |
tree | a6e7d0e2710d66c585c7ffe4451eee85710d8ba7 /Objects | |
parent | b54d7c87aaf23fbd67171d0dd3e4f4ab736e6a48 (diff) | |
download | cpython-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.c | 62 |
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 * |