summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/typing.rst14
-rw-r--r--Doc/whatsnew/3.14.rst2
-rw-r--r--Lib/test/test_type_aliases.py13
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-16-56-26.gh-issue-126085.BvyEXk.rst1
-rw-r--r--Objects/typevarobject.c15
5 files changed, 37 insertions, 8 deletions
diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index 19b4081..13108ab 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 7b1a30d..8dfe25a 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 230bbe6..ee1791b 100644
--- a/Lib/test/test_type_aliases.py
+++ b/Lib/test/test_type_aliases.py
@@ -5,7 +5,7 @@ from test.support import check_syntax_error, run_code
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 @@ class TypeAliasTypeTest(unittest.TestCase):
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 0000000..25b23fd
--- /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 d815829..3ab8cb1 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,