[Python-checkins] gh-87390: Add __unpacked__ attribute to types.GenericAlias (#92059)

JelleZijlstra webhook-mailer at python.org
Mon May 2 15:22:04 EDT 2022


https://github.com/python/cpython/commit/ff88f7e007deb7a9f7539938dcf6f4adbfebf442
commit: ff88f7e007deb7a9f7539938dcf6f4adbfebf442
branch: main
author: Jelle Zijlstra <jelle.zijlstra at gmail.com>
committer: JelleZijlstra <jelle.zijlstra at gmail.com>
date: 2022-05-02T13:21:59-06:00
summary:

gh-87390: Add __unpacked__ attribute to types.GenericAlias (#92059)

files:
A Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst
M Doc/library/stdtypes.rst
M Lib/test/test_genericalias.py
M Objects/genericaliasobject.c

diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index 764d83a6800d1..44447400c29bc 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -5055,6 +5055,15 @@ All parameterized generics implement special read-only attributes.
       have correct ``__parameters__`` after substitution because
       :class:`typing.ParamSpec` is intended primarily for static type checking.
 
+
+.. attribute:: genericalias.__unpacked__
+
+   A boolean that is true if the alias has been unpacked using the
+   ``*`` operator (see :data:`~typing.TypeVarTuple`).
+
+   .. versionadded:: 3.11
+
+
 .. seealso::
 
    :pep:`484` - Type Hints
diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py
index 635ac0f7a85d7..2d2adc11e1594 100644
--- a/Lib/test/test_genericalias.py
+++ b/Lib/test/test_genericalias.py
@@ -418,6 +418,12 @@ def __deepcopy__(self, memo):
                 self.assertEqual(copied.__args__, alias.__args__)
                 self.assertEqual(copied.__parameters__, alias.__parameters__)
 
+    def test_unpack(self):
+        alias = tuple[str, ...]
+        self.assertIs(alias.__unpacked__, False)
+        unpacked = (*alias,)[0]
+        self.assertIs(unpacked.__unpacked__, True)
+
     def test_union(self):
         a = typing.Union[list[int], list[str]]
         self.assertEqual(a.__args__, (list[int], list[str]))
diff --git a/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst b/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst
new file mode 100644
index 0000000000000..c368c1eb3be18
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst
@@ -0,0 +1,2 @@
+Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by
+Jelle Zijlstra.
diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c
index 7b689912dffc1..c6ed1611bd29e 100644
--- a/Objects/genericaliasobject.c
+++ b/Objects/genericaliasobject.c
@@ -516,6 +516,7 @@ ga_vectorcall(PyObject *self, PyObject *const *args,
 static const char* const attr_exceptions[] = {
     "__origin__",
     "__args__",
+    "__unpacked__",
     "__parameters__",
     "__mro_entries__",
     "__reduce_ex__",  // needed so we don't look up object.__reduce_ex__
@@ -657,6 +658,7 @@ static PyMethodDef ga_methods[] = {
 static PyMemberDef ga_members[] = {
     {"__origin__", T_OBJECT, offsetof(gaobject, origin), READONLY},
     {"__args__", T_OBJECT, offsetof(gaobject, args), READONLY},
+    {"__unpacked__", T_BOOL, offsetof(gaobject, starred), READONLY},
     {0}
 };
 



More information about the Python-checkins mailing list