@@ -1036,6 +1036,12 @@ type_qualname(PyTypeObject *type, void *context)
10361036 }
10371037}
10381038
1039+ static PyObject *
1040+ type_fullyqualname (PyTypeObject * type , void * context )
1041+ {
1042+ return _PyType_GetFullyQualName (type , 0 );
1043+ }
1044+
10391045static int
10401046type_set_name (PyTypeObject * type , PyObject * value , void * context )
10411047{
@@ -1598,6 +1604,7 @@ type___subclasscheck___impl(PyTypeObject *self, PyObject *subclass)
15981604static PyGetSetDef type_getsets [] = {
15991605 {"__name__" , (getter )type_name , (setter )type_set_name , NULL },
16001606 {"__qualname__" , (getter )type_qualname , (setter )type_set_qualname , NULL },
1607+ {"__fullyqualname__" , (getter )type_fullyqualname , NULL , NULL },
16011608 {"__bases__" , (getter )type_get_bases , (setter )type_set_bases , NULL },
16021609 {"__mro__" , (getter )type_get_mro , NULL , NULL },
16031610 {"__module__" , (getter )type_module , (setter )type_set_module , NULL },
@@ -1615,33 +1622,18 @@ static PyObject *
16151622type_repr (PyTypeObject * type )
16161623{
16171624 if (type -> tp_name == NULL ) {
1618- // type_repr() called before the type is fully initialized
1619- // by PyType_Ready().
1625+ // If type_repr() is called before the type is fully initialized
1626+ // by PyType_Ready(), just format the type memory address .
16201627 return PyUnicode_FromFormat ("<class at %p>" , type );
16211628 }
16221629
1623- PyObject * mod , * name , * rtn ;
1624-
1625- mod = type_module (type , NULL );
1626- if (mod == NULL )
1627- PyErr_Clear ();
1628- else if (!PyUnicode_Check (mod )) {
1629- Py_SETREF (mod , NULL );
1630- }
1631- name = type_qualname (type , NULL );
1632- if (name == NULL ) {
1633- Py_XDECREF (mod );
1630+ PyObject * fullqualname = _PyType_GetFullyQualName (type , 1 );
1631+ if (fullqualname == NULL ) {
16341632 return NULL ;
16351633 }
1636-
1637- if (mod != NULL && !_PyUnicode_Equal (mod , & _Py_ID (builtins )))
1638- rtn = PyUnicode_FromFormat ("<class '%U.%U'>" , mod , name );
1639- else
1640- rtn = PyUnicode_FromFormat ("<class '%s'>" , type -> tp_name );
1641-
1642- Py_XDECREF (mod );
1643- Py_DECREF (name );
1644- return rtn ;
1634+ PyObject * result = PyUnicode_FromFormat ("<class '%U'>" , fullqualname );
1635+ Py_DECREF (fullqualname );
1636+ return result ;
16451637}
16461638
16471639static PyObject *
@@ -4560,6 +4552,53 @@ PyType_GetQualName(PyTypeObject *type)
45604552 return type_qualname (type , NULL );
45614553}
45624554
4555+
4556+ PyObject *
4557+ _PyType_GetFullyQualName (PyTypeObject * type , int ignore_module_error )
4558+ {
4559+ // type is a static type and PyType_Ready() was not called on it yet?
4560+ if (type -> tp_name == NULL ) {
4561+ PyErr_SetString (PyExc_TypeError , "static type not initialized" );
4562+ return NULL ;
4563+ }
4564+
4565+ if (!(type -> tp_flags & Py_TPFLAGS_HEAPTYPE )) {
4566+ // Static type
4567+ return PyUnicode_FromString (type -> tp_name );
4568+ }
4569+
4570+ PyObject * qualname = type_qualname (type , NULL );
4571+ if (qualname == NULL ) {
4572+ return NULL ;
4573+ }
4574+
4575+ PyObject * module = type_module (type , NULL );
4576+ if (module == NULL ) {
4577+ if (ignore_module_error ) {
4578+ // type_repr() ignores type_module() errors
4579+ PyErr_Clear ();
4580+ return qualname ;
4581+ }
4582+
4583+ Py_DECREF (qualname );
4584+ return NULL ;
4585+ }
4586+
4587+ PyObject * result ;
4588+ if (PyUnicode_Check (module )
4589+ && !_PyUnicode_Equal (module , & _Py_ID (builtins )))
4590+ {
4591+ result = PyUnicode_FromFormat ("%U.%U" , module , qualname );
4592+ }
4593+ else {
4594+ result = Py_NewRef (qualname );
4595+ }
4596+ Py_DECREF (module );
4597+ Py_DECREF (qualname );
4598+ return result ;
4599+ }
4600+
4601+
45634602void *
45644603PyType_GetSlot (PyTypeObject * type , int slot )
45654604{
@@ -5250,6 +5289,7 @@ type___sizeof___impl(PyTypeObject *self)
52505289 return PyLong_FromSize_t (size );
52515290}
52525291
5292+
52535293static PyMethodDef type_methods [] = {
52545294 TYPE_MRO_METHODDEF
52555295 TYPE___SUBCLASSES___METHODDEF
0 commit comments