gh-87390: Add __unpacked__ attribute to types.GenericAlias (#92059)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -418,6 +418,12 @@ class BaseTest(unittest.TestCase):
|
||||
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]))
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by
|
||||
Jelle Zijlstra.
|
||||
@@ -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}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user