Skip to content

Commit e20505c

Browse files
[3.13] gh-124498: Fix TypeAliasType not to be generic, when type_params=() (GH-124499) (#124603)
gh-124498: Fix `TypeAliasType` not to be generic, when `type_params=()` (GH-124499) (cherry picked from commit abe5f79) Co-authored-by: sobolevn <mail@sobolevn.me>
1 parent 6b847be commit e20505c

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

Diff for: Lib/test/test_type_aliases.py

+13
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,19 @@ def test_generic(self):
212212
self.assertEqual(TA.__value__, list[T])
213213
self.assertEqual(TA.__type_params__, (T,))
214214
self.assertEqual(TA.__module__, __name__)
215+
self.assertIs(type(TA[int]), types.GenericAlias)
216+
217+
def test_not_generic(self):
218+
TA = TypeAliasType("TA", list[int], type_params=())
219+
self.assertEqual(TA.__name__, "TA")
220+
self.assertEqual(TA.__value__, list[int])
221+
self.assertEqual(TA.__type_params__, ())
222+
self.assertEqual(TA.__module__, __name__)
223+
with self.assertRaisesRegex(
224+
TypeError,
225+
"Only generic type aliases are subscriptable",
226+
):
227+
TA[int]
215228

216229
def test_keywords(self):
217230
TA = TypeAliasType(name="TA", value=int)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :class:`typing.TypeAliasType` not to be generic, when ``type_params`` is
2+
an empty tuple.

Diff for: Objects/typevarobject.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -1640,7 +1640,16 @@ typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value,
16401640
return NULL;
16411641
}
16421642
ta->name = Py_NewRef(name);
1643-
ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params);
1643+
if (
1644+
type_params == NULL
1645+
|| Py_IsNone(type_params)
1646+
|| (PyTuple_Check(type_params) && PyTuple_GET_SIZE(type_params) == 0)
1647+
) {
1648+
ta->type_params = NULL;
1649+
}
1650+
else {
1651+
ta->type_params = Py_NewRef(type_params);
1652+
}
16441653
ta->compute_value = Py_XNewRef(compute_value);
16451654
ta->value = Py_XNewRef(value);
16461655
ta->module = Py_XNewRef(module);

0 commit comments

Comments
 (0)