https://github.com/python/cpython/commit/e091520fdbcfe406e5fdcf66b7864b2b34a6726b
commit: e091520fdbcfe406e5fdcf66b7864b2b34a6726b
branch: main
author: Tomas R. <tomas.ro...@gmail.com>
committer: JelleZijlstra <jelle.zijls...@gmail.com>
date: 2025-03-04T11:34:59-08:00
summary:

gh-126085: Add `tp_iter` to TypeAliasType to allow star unpacking (#127981)

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-16-56-26.gh-issue-126085.BvyEXk.rst
M Doc/library/typing.rst
M Doc/whatsnew/3.14.rst
M Lib/test/test_type_aliases.py
M Objects/typevarobject.c

diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index 19b4081c993e44..13108abdeaf267 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -2292,6 +2292,20 @@ without the dedicated syntax, as documented below.
 
       .. versionadded:: 3.14
 
+   .. rubric:: Unpacking
+
+   Type aliases support star unpacking using the ``*Alias`` syntax.
+   This is equivalent to using ``Unpack[Alias]`` directly:
+
+   .. doctest::
+
+      >>> type Alias = tuple[int, str]
+      >>> type Unpacked = tuple[bool, *Alias]
+      >>> Unpacked.__value__
+      tuple[bool, typing.Unpack[Alias]]
+
+   .. versionadded:: next
+
 
 Other special directives
 """"""""""""""""""""""""
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 7b1a30d5a873ae..8dfe25ad99abe3 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -1326,6 +1326,8 @@ typing
 * Remove :class:`!typing.ByteString`. It had previously raised a
   :exc:`DeprecationWarning` since Python 3.12.
 
+* :class:`typing.TypeAliasType` now supports star unpacking.
+
 urllib
 ------
 
diff --git a/Lib/test/test_type_aliases.py b/Lib/test/test_type_aliases.py
index 230bbe646baf28..ee1791bc1d0b9d 100644
--- a/Lib/test/test_type_aliases.py
+++ b/Lib/test/test_type_aliases.py
@@ -5,7 +5,7 @@
 from test.typinganndata import mod_generics_cache
 
 from typing import (
-    Callable, TypeAliasType, TypeVar, TypeVarTuple, ParamSpec, get_args,
+    Callable, TypeAliasType, TypeVar, TypeVarTuple, ParamSpec, Unpack, 
get_args,
 )
 
 
@@ -317,6 +317,17 @@ def test_module(self):
         self.assertEqual(mod_generics_cache.OldStyle.__module__,
                          mod_generics_cache.__name__)
 
+    def test_unpack(self):
+        type Alias = tuple[int, int]
+        unpacked = (*Alias,)[0]
+        self.assertEqual(unpacked, Unpack[Alias])
+
+        class Foo[*Ts]:
+            pass
+
+        x = Foo[str, *Alias]
+        self.assertEqual(x.__args__, (str, Unpack[Alias]))
+
 
 # All these type aliases are used for pickling tests:
 T = TypeVar('T')
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-16-56-26.gh-issue-126085.BvyEXk.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-16-56-26.gh-issue-126085.BvyEXk.rst
new file mode 100644
index 00000000000000..25b23fd27c0b92
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-16-56-26.gh-issue-126085.BvyEXk.rst
@@ -0,0 +1 @@
+:class:`typing.TypeAliasType` now supports star unpacking.
diff --git a/Objects/typevarobject.c b/Objects/typevarobject.c
index d8158293acaabd..3ab8cb14686e84 100644
--- a/Objects/typevarobject.c
+++ b/Objects/typevarobject.c
@@ -1,4 +1,4 @@
-// TypeVar, TypeVarTuple, and ParamSpec
+// TypeVar, TypeVarTuple, ParamSpec, and TypeAlias
 #include "Python.h"
 #include "pycore_object.h"        // _PyObject_GC_TRACK/UNTRACK, 
PyAnnotateFormat
 #include "pycore_typevarobject.h"
@@ -394,7 +394,7 @@ caller(void)
 }
 
 static PyObject *
-typevartuple_unpack(PyObject *tvt)
+unpack(PyObject *self)
 {
     PyObject *typing = PyImport_ImportModule("typing");
     if (typing == NULL) {
@@ -405,7 +405,7 @@ typevartuple_unpack(PyObject *tvt)
         Py_DECREF(typing);
         return NULL;
     }
-    PyObject *unpacked = PyObject_GetItem(unpack, tvt);
+    PyObject *unpacked = PyObject_GetItem(unpack, self);
     Py_DECREF(typing);
     Py_DECREF(unpack);
     return unpacked;
@@ -440,7 +440,7 @@ unpack_typevartuples(PyObject *params)
         for (Py_ssize_t i = 0; i < n; i++) {
             PyObject *param = PyTuple_GET_ITEM(params, i);
             if (Py_IS_TYPE(param, tp)) {
-                PyObject *unpacked = typevartuple_unpack(param);
+                PyObject *unpacked = unpack(param);
                 if (unpacked == NULL) {
                     Py_DECREF(new_params);
                     return NULL;
@@ -1524,9 +1524,9 @@ typevartuple_dealloc(PyObject *self)
 }
 
 static PyObject *
-typevartuple_iter(PyObject *self)
+unpack_iter(PyObject *self)
 {
-    PyObject *unpacked = typevartuple_unpack(self);
+    PyObject *unpacked = unpack(self);
     if (unpacked == NULL) {
         return NULL;
     }
@@ -1782,7 +1782,7 @@ PyType_Slot typevartuple_slots[] = {
     {Py_tp_methods, typevartuple_methods},
     {Py_tp_getset, typevartuple_getset},
     {Py_tp_new, typevartuple},
-    {Py_tp_iter, typevartuple_iter},
+    {Py_tp_iter, unpack_iter},
     {Py_tp_repr, typevartuple_repr},
     {Py_tp_dealloc, typevartuple_dealloc},
     {Py_tp_alloc, PyType_GenericAlloc},
@@ -2158,6 +2158,7 @@ PyTypeObject _PyTypeAlias_Type = {
     .tp_dealloc = typealias_dealloc,
     .tp_new = typealias_new,
     .tp_free = PyObject_GC_Del,
+    .tp_iter = unpack_iter,
     .tp_traverse = typealias_traverse,
     .tp_clear = typealias_clear,
     .tp_repr = typealias_repr,

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to