Skip to content

Commit 2bb3089

Browse files
Parameter __qualname__ is added to TypeAliasType
1 parent f575dd9 commit 2bb3089

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

Lib/test/test_type_aliases.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,31 +144,33 @@ def test_subscripting(self):
144144

145145
def test_repr(self):
146146
type Simple = int
147-
type VeryGeneric[T, *Ts, **P] = Callable[P, tuple[T, *Ts]]
147+
self.assertEqual(repr(Simple), Simple.__qualname__)
148148

149-
self.assertEqual(repr(Simple), "Simple")
150-
self.assertEqual(repr(VeryGeneric), "VeryGeneric")
149+
type VeryGeneric[T, *Ts, **P] = Callable[P, tuple[T, *Ts]]
150+
self.assertEqual(repr(VeryGeneric), VeryGeneric.__qualname__)
151+
fullname = f"{VeryGeneric.__module__}.{VeryGeneric.__qualname__}"
151152
self.assertEqual(repr(VeryGeneric[int, bytes, str, [float, object]]),
152-
"VeryGeneric[int, bytes, str, [float, object]]")
153+
f"{fullname}[int, bytes, str, [float, object]]")
153154
self.assertEqual(repr(VeryGeneric[int, []]),
154-
"VeryGeneric[int, []]")
155+
f"{fullname}[int, []]")
155156
self.assertEqual(repr(VeryGeneric[int, [VeryGeneric[int], list[str]]]),
156-
"VeryGeneric[int, [VeryGeneric[int], list[str]]]")
157+
f"{fullname}[int, [{fullname}[int], list[str]]]")
157158

158159
def test_recursive_repr(self):
159160
type Recursive = Recursive
160-
self.assertEqual(repr(Recursive), "Recursive")
161+
self.assertEqual(repr(Recursive), Recursive.__qualname__)
161162

162163
type X = list[Y]
163164
type Y = list[X]
164-
self.assertEqual(repr(X), "X")
165-
self.assertEqual(repr(Y), "Y")
165+
self.assertEqual(repr(X), X.__qualname__)
166+
self.assertEqual(repr(Y), Y.__qualname__)
166167

167168
type GenericRecursive[X] = list[X | GenericRecursive[X]]
168-
self.assertEqual(repr(GenericRecursive), "GenericRecursive")
169-
self.assertEqual(repr(GenericRecursive[int]), "GenericRecursive[int]")
169+
self.assertEqual(repr(GenericRecursive), GenericRecursive.__qualname__)
170+
fullname = f"{GenericRecursive.__module__}.{GenericRecursive.__qualname__}"
171+
self.assertEqual(repr(GenericRecursive[int]), f"{fullname}[int]")
170172
self.assertEqual(repr(GenericRecursive[GenericRecursive[int]]),
171-
"GenericRecursive[GenericRecursive[int]]")
173+
f"{fullname}[{fullname}[int]]")
172174

173175
def test_raising(self):
174176
type MissingName = list[_My_X]

Objects/typevarobject.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ typedef struct {
5353
typedef struct {
5454
PyObject_HEAD
5555
PyObject *name;
56+
PyObject *qualname;
5657
PyObject *type_params;
5758
PyObject *compute_value;
5859
PyObject *value;
@@ -1852,6 +1853,7 @@ typealias_dealloc(PyObject *self)
18521853
_PyObject_GC_UNTRACK(self);
18531854
typealiasobject *ta = typealiasobject_CAST(self);
18541855
Py_DECREF(ta->name);
1856+
Py_DECREF(ta->qualname);
18551857
Py_XDECREF(ta->type_params);
18561858
Py_XDECREF(ta->compute_value);
18571859
Py_XDECREF(ta->value);
@@ -1878,11 +1880,12 @@ static PyObject *
18781880
typealias_repr(PyObject *self)
18791881
{
18801882
typealiasobject *ta = (typealiasobject *)self;
1881-
return Py_NewRef(ta->name);
1883+
return Py_NewRef(ta->qualname);
18821884
}
18831885

18841886
static PyMemberDef typealias_members[] = {
18851887
{"__name__", _Py_T_OBJECT, offsetof(typealiasobject, name), Py_READONLY},
1888+
{"__qualname__", _Py_T_OBJECT, offsetof(typealiasobject, qualname), Py_READONLY},
18861889
{0}
18871890
};
18881891

@@ -1997,7 +2000,7 @@ typealias_check_type_params(PyObject *type_params, int *err) {
19972000
}
19982001

19992002
static PyObject *
2000-
typelias_convert_type_params(PyObject *type_params)
2003+
typealias_convert_type_params(PyObject *type_params)
20012004
{
20022005
if (
20032006
type_params == NULL
@@ -2012,14 +2015,15 @@ typelias_convert_type_params(PyObject *type_params)
20122015
}
20132016

20142017
static typealiasobject *
2015-
typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value,
2016-
PyObject *value, PyObject *module)
2018+
typealias_alloc(PyObject *name, PyObject *qualname, PyObject *type_params,
2019+
PyObject *compute_value, PyObject *value, PyObject *module)
20172020
{
20182021
typealiasobject *ta = PyObject_GC_New(typealiasobject, &_PyTypeAlias_Type);
20192022
if (ta == NULL) {
20202023
return NULL;
20212024
}
20222025
ta->name = Py_NewRef(name);
2026+
ta->qualname = Py_NewRef(qualname);
20232027
ta->type_params = Py_XNewRef(type_params);
20242028
ta->compute_value = Py_XNewRef(compute_value);
20252029
ta->value = Py_XNewRef(value);
@@ -2112,8 +2116,10 @@ typealias_new_impl(PyTypeObject *type, PyObject *name, PyObject *value,
21122116
if (module == NULL) {
21132117
return NULL;
21142118
}
2115-
PyObject *ta = (PyObject *)typealias_alloc(name, checked_params, NULL, value,
2116-
module);
2119+
2120+
// It's impossible to determine qualname, so we use name insted.
2121+
PyObject *ta = (PyObject *)typealias_alloc(
2122+
name, name, checked_params, NULL, value, module);
21172123
Py_DECREF(module);
21182124
return ta;
21192125
}
@@ -2179,10 +2185,17 @@ _Py_make_typealias(PyThreadState* unused, PyObject *args)
21792185
assert(PyTuple_GET_SIZE(args) == 3);
21802186
PyObject *name = PyTuple_GET_ITEM(args, 0);
21812187
assert(PyUnicode_Check(name));
2182-
PyObject *type_params = typelias_convert_type_params(PyTuple_GET_ITEM(args, 1));
2188+
PyObject *type_params = typealias_convert_type_params(PyTuple_GET_ITEM(args, 1));
21832189
PyObject *compute_value = PyTuple_GET_ITEM(args, 2);
21842190
assert(PyFunction_Check(compute_value));
2185-
return (PyObject *)typealias_alloc(name, type_params, compute_value, NULL, NULL);
2191+
2192+
PyFunctionObject *compute_func = (PyFunctionObject *)compute_value;
2193+
PyCodeObject *code_obj = (PyCodeObject *)compute_func->func_code;
2194+
PyObject *qualname = code_obj->co_qualname;
2195+
assert(qualname != NULL);
2196+
2197+
return (PyObject *)typealias_alloc(
2198+
name, qualname, type_params, compute_value, NULL, NULL);
21862199
}
21872200

21882201
PyDoc_STRVAR(generic_doc,

0 commit comments

Comments
 (0)