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