Skip to content

Commit abe5f79

Browse files
authored
gh-124498: Fix TypeAliasType not to be generic, when type_params=() (#124499)
1 parent cf24180 commit abe5f79

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

Lib/test/test_type_aliases.py

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

215228
def test_keywords(self):
216229
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.

Objects/typevarobject.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -1915,7 +1915,16 @@ typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value,
19151915
return NULL;
19161916
}
19171917
ta->name = Py_NewRef(name);
1918-
ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params);
1918+
if (
1919+
type_params == NULL
1920+
|| Py_IsNone(type_params)
1921+
|| (PyTuple_Check(type_params) && PyTuple_GET_SIZE(type_params) == 0)
1922+
) {
1923+
ta->type_params = NULL;
1924+
}
1925+
else {
1926+
ta->type_params = Py_NewRef(type_params);
1927+
}
19191928
ta->compute_value = Py_XNewRef(compute_value);
19201929
ta->value = Py_XNewRef(value);
19211930
ta->module = Py_XNewRef(module);

0 commit comments

Comments
 (0)