Skip to content

Commit

Permalink
gh-103629: Update typing.Unpack docs in compliance with PEP 692 (#103894
Browse files Browse the repository at this point in the history
)
  • Loading branch information
franekmagiera authored Apr 26, 2023
1 parent a3a5b4b commit dc3f975
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
24 changes: 22 additions & 2 deletions Doc/library/typing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ annotations. These include:
*Introducing* :data:`LiteralString`
* :pep:`681`: Data Class Transforms
*Introducing* the :func:`@dataclass_transform<dataclass_transform>` decorator
* :pep:`692`: Using ``TypedDict`` for more precise ``**kwargs`` typing
*Introducing* a new way of typing ``**kwargs`` with :data:`Unpack` and
:data:`TypedDict`
* :pep:`698`: Adding an override decorator to typing
*Introducing* the :func:`@override<override>` decorator

Expand Down Expand Up @@ -1417,8 +1420,10 @@ These are not used in annotations. They are building blocks for creating generic
tup: tuple[Unpack[Ts]]

In fact, ``Unpack`` can be used interchangeably with ``*`` in the context
of types. You might see ``Unpack`` being used explicitly in older versions
of Python, where ``*`` couldn't be used in certain places::
of :class:`typing.TypeVarTuple <TypeVarTuple>` and
:class:`builtins.tuple <tuple>` types. You might see ``Unpack`` being used
explicitly in older versions of Python, where ``*`` couldn't be used in
certain places::

# In older versions of Python, TypeVarTuple and Unpack
# are located in the `typing_extensions` backports package.
Expand All @@ -1428,6 +1433,21 @@ These are not used in annotations. They are building blocks for creating generic
tup: tuple[*Ts] # Syntax error on Python <= 3.10!
tup: tuple[Unpack[Ts]] # Semantically equivalent, and backwards-compatible

``Unpack`` can also be used along with :class:`typing.TypedDict` for typing
``**kwargs`` in a function signature::

from typing import TypedDict, Unpack

class Movie(TypedDict):
name: str
year: int

# This function expects two keyword arguments - `name` of type `str`
# and `year` of type `int`.
def foo(**kwargs: Unpack[Movie]): ...

See :pep:`692` for more details on using ``Unpack`` for ``**kwargs`` typing.

.. versionadded:: 3.11

.. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False)
Expand Down
34 changes: 34 additions & 0 deletions Doc/whatsnew/3.12.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ Summary -- Release highlights
.. PEP-sized items next.
New typing features:

* :ref:`whatsnew312-pep692`

Important deprecations, removals or restrictions:

* :pep:`623`, Remove wstr from Unicode
Expand Down Expand Up @@ -145,6 +149,36 @@ New Features
In Python 3.14, the default will switch to ``'data'``.
(Contributed by Petr Viktorin in :pep:`706`.)

New Features Related to Type Hints
==================================

This section covers major changes affecting :pep:`484` type hints and
the :mod:`typing` module.

.. _whatsnew312-pep692:

PEP 692: Using ``TypedDict`` for more precise ``**kwargs`` typing
-----------------------------------------------------------------

Typing ``**kwargs`` in a function signature as introduced by :pep:`484` allowed
for valid annotations only in cases where all of the ``**kwargs`` were of the
same type.

This PEP specifies a more precise way of typing ``**kwargs`` by relying on
typed dictionaries::

from typing import TypedDict, Unpack

class Movie(TypedDict):
name: str
year: int

def foo(**kwargs: Unpack[Movie]): ...

See :pep:`692` for more details.

(PEP written by Franek Magiera)


Other Language Changes
======================
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Mention the new way of typing ``**kwargs`` with ``Unpack`` and ``TypedDict``
introduced in :pep:`692`.

0 comments on commit dc3f975

Please sign in to comment.