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
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]))
--- /dev/null
+Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by
+Jelle Zijlstra.
static const char* const attr_exceptions[] = {
"__origin__",
"__args__",
+ "__unpacked__",
"__parameters__",
"__mro_entries__",
"__reduce_ex__", // needed so we don't look up object.__reduce_ex__
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}
};