mirror of https://github.com/python/cpython
gh-124498: Fix `TypeAliasType` not to be generic, when `type_params=()` (#124499)
This commit is contained in:
parent
cf2418076d
commit
abe5f799e6
|
@ -211,6 +211,19 @@ class TypeAliasConstructorTest(unittest.TestCase):
|
||||||
self.assertEqual(TA.__value__, list[T])
|
self.assertEqual(TA.__value__, list[T])
|
||||||
self.assertEqual(TA.__type_params__, (T,))
|
self.assertEqual(TA.__type_params__, (T,))
|
||||||
self.assertEqual(TA.__module__, __name__)
|
self.assertEqual(TA.__module__, __name__)
|
||||||
|
self.assertIs(type(TA[int]), types.GenericAlias)
|
||||||
|
|
||||||
|
def test_not_generic(self):
|
||||||
|
TA = TypeAliasType("TA", list[int], type_params=())
|
||||||
|
self.assertEqual(TA.__name__, "TA")
|
||||||
|
self.assertEqual(TA.__value__, list[int])
|
||||||
|
self.assertEqual(TA.__type_params__, ())
|
||||||
|
self.assertEqual(TA.__module__, __name__)
|
||||||
|
with self.assertRaisesRegex(
|
||||||
|
TypeError,
|
||||||
|
"Only generic type aliases are subscriptable",
|
||||||
|
):
|
||||||
|
TA[int]
|
||||||
|
|
||||||
def test_keywords(self):
|
def test_keywords(self):
|
||||||
TA = TypeAliasType(name="TA", value=int)
|
TA = TypeAliasType(name="TA", value=int)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix :class:`typing.TypeAliasType` not to be generic, when ``type_params`` is
|
||||||
|
an empty tuple.
|
|
@ -1915,7 +1915,16 @@ typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
ta->name = Py_NewRef(name);
|
ta->name = Py_NewRef(name);
|
||||||
ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params);
|
if (
|
||||||
|
type_params == NULL
|
||||||
|
|| Py_IsNone(type_params)
|
||||||
|
|| (PyTuple_Check(type_params) && PyTuple_GET_SIZE(type_params) == 0)
|
||||||
|
) {
|
||||||
|
ta->type_params = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ta->type_params = Py_NewRef(type_params);
|
||||||
|
}
|
||||||
ta->compute_value = Py_XNewRef(compute_value);
|
ta->compute_value = Py_XNewRef(compute_value);
|
||||||
ta->value = Py_XNewRef(value);
|
ta->value = Py_XNewRef(value);
|
||||||
ta->module = Py_XNewRef(module);
|
ta->module = Py_XNewRef(module);
|
||||||
|
|
Loading…
Reference in New Issue