Skip to content

gh-119127: functools: Improve docs for partial and Placeholder #124575

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 26, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 17 additions & 15 deletions Doc/library/functools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ The :mod:`functools` module defines the following functions:
newfunc.keywords = keywords
return newfunc

The :func:`partial` function is used for partial function application which "freezes"
The :func:`!partial` function is used for partial function application which "freezes"
some portion of a function's arguments and/or keywords resulting in a new object
with a simplified signature. For example, :func:`partial` can be used to create
a callable that behaves like the :func:`int` function where the *base* argument
Expand All @@ -368,25 +368,27 @@ The :mod:`functools` module defines the following functions:
18

If :data:`Placeholder` sentinels are present in *args*, they will be filled first
when :func:`partial` is called. This allows custom selection of positional arguments
to be pre-filled when constructing a :ref:`partial object <partial-objects>`.
when :func:`!partial` is called. This makes it possible to pre-fill any positional
argument with a call to :func:`!partial`; without :data:`!Placeholder`, only the
first positional argument can be pre-filled.

If :data:`!Placeholder` sentinels are present, all of them must be filled at call time:
If any :data:`!Placeholder` sentinels are present, all must be filled at call time:

.. doctest::

>>> say_to_world = partial(print, Placeholder, Placeholder, "world!")
>>> say_to_world('Hello', 'dear')
Hello dear world!

Calling ``say_to_world('Hello')`` would raise a :exc:`TypeError`, because
only one positional argument is provided, while there are two placeholders
in :ref:`partial object <partial-objects>`.
Calling ``say_to_world('Hello')`` raises a :exc:`TypeError`, because
only one positional argument is provided, but there are two placeholders
that must be filled in.

Successive :func:`partial` applications fill :data:`!Placeholder` sentinels
of the input :func:`partial` objects with new positional arguments.
A place for positional argument can be retained by inserting new
:data:`!Placeholder` sentinel to the place held by previous :data:`!Placeholder`:
If :func:`!partial` is applied to an existing :func:`!partial` object,
:data:`!Placeholder` sentinels of the input object are filled in with
new positional arguments.
A placeholder can be retained by inserting a new
:data:`!Placeholder` sentinel to the place held by a previous :data:`!Placeholder`:

.. doctest::

Expand All @@ -402,8 +404,8 @@ The :mod:`functools` module defines the following functions:
>>> remove_first_dear(message)
'Hello, dear world!'

Note, :data:`!Placeholder` has no special treatment when used for keyword
argument of :data:`!Placeholder`.
:data:`!Placeholder` has no special treatment when used in a keyword
argument to :func:`!partial`.

.. versionchanged:: 3.14
Added support for :data:`Placeholder` in positional arguments.
Expand Down Expand Up @@ -791,7 +793,7 @@ have three read-only attributes:
The keyword arguments that will be supplied when the :class:`partial` object is
called.

:class:`partial` objects are like :class:`function` objects in that they are
:class:`partial` objects are like :ref:`function objects <user-defined-funcs>` in that they are
callable, weak referenceable, and can have attributes. There are some important
differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes
differences. For instance, the :attr:`~definition.__name__` and :attr:`~definition.__doc__` attributes
are not created automatically.
Loading