]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-124498: Fix `TypeAliasType` not to be generic, when `type_params=()` (#124499)
authorsobolevn <mail@sobolevn.me>
Thu, 26 Sep 2024 14:15:38 +0000 (17:15 +0300)
committerGitHub <noreply@github.com>
Thu, 26 Sep 2024 14:15:38 +0000 (17:15 +0300)
Lib/test/test_type_aliases.py
Misc/NEWS.d/next/Library/2024-09-25-12-14-58.gh-issue-124498.Ozxs55.rst [new file with mode: 0644]
Objects/typevarobject.c

index 49d6aa810304fbeed3f546338a4f2f4eca86707f..ebb65d8c6cf81b3e0baded4e5c19066947cd1f40 100644 (file)
@@ -211,6 +211,19 @@ class TypeAliasConstructorTest(unittest.TestCase):
         self.assertEqual(TA.__value__, list[T])
         self.assertEqual(TA.__type_params__, (T,))
         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):
         TA = TypeAliasType(name="TA", value=int)
diff --git a/Misc/NEWS.d/next/Library/2024-09-25-12-14-58.gh-issue-124498.Ozxs55.rst b/Misc/NEWS.d/next/Library/2024-09-25-12-14-58.gh-issue-124498.Ozxs55.rst
new file mode 100644 (file)
index 0000000..4dbf4eb
--- /dev/null
@@ -0,0 +1,2 @@
+Fix :class:`typing.TypeAliasType` not to be generic, when ``type_params`` is
+an empty tuple.
index 09e9ab39364742ee7ed2c6de24b6b7fb47bc4316..552c474559019414d457874a0bba45a386473834 100644 (file)
@@ -1915,7 +1915,16 @@ typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value,
         return NULL;
     }
     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->value = Py_XNewRef(value);
     ta->module = Py_XNewRef(module);