Skip to content

Commit

Permalink
[3.11] gh-101100: Improve documentation on function attributes (#112933
Browse files Browse the repository at this point in the history
…) (#113003)

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
  • Loading branch information
AlexWaygood and hugovk authored Dec 12, 2023
1 parent ada2d77 commit f83087c
Show file tree
Hide file tree
Showing 13 changed files with 152 additions and 122 deletions.
23 changes: 13 additions & 10 deletions Doc/c-api/function.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,20 @@ There are a few functions specific to Python functions.
Return a new function object associated with the code object *code*. *globals*
must be a dictionary with the global variables accessible to the function.
The function's docstring and name are retrieved from the code object. *__module__*
The function's docstring and name are retrieved from the code object.
:func:`~function.__module__`
is retrieved from *globals*. The argument defaults, annotations and closure are
set to ``NULL``. *__qualname__* is set to the same value as the code object's
:attr:`~codeobject.co_qualname` field.
set to ``NULL``. :attr:`~function.__qualname__` is set to the same value as
the code object's :attr:`~codeobject.co_qualname` field.
.. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
As :c:func:`PyFunction_New`, but also allows setting the function object's
``__qualname__`` attribute. *qualname* should be a unicode object or ``NULL``;
if ``NULL``, the ``__qualname__`` attribute is set to the same value as the
code object's :attr:`~codeobject.co_qualname` field.
:attr:`~function.__qualname__` attribute.
*qualname* should be a unicode object or ``NULL``;
if ``NULL``, the :attr:`!__qualname__` attribute is set to the same value as
the code object's :attr:`~codeobject.co_qualname` field.
.. versionadded:: 3.3
Expand All @@ -62,11 +64,12 @@ There are a few functions specific to Python functions.
.. c:function:: PyObject* PyFunction_GetModule(PyObject *op)
Return a :term:`borrowed reference` to the *__module__* attribute of the
function object *op*. It can be *NULL*.
Return a :term:`borrowed reference` to the :attr:`~function.__module__`
attribute of the :ref:`function object <user-defined-funcs>` *op*.
It can be *NULL*.
This is normally a string containing the module name, but can be set to any
other object by Python code.
This is normally a :class:`string <str>` containing the module name,
but can be set to any other object by Python code.
.. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op)
Expand Down
3 changes: 2 additions & 1 deletion Doc/howto/annotations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@ on an arbitrary object ``o``:
unwrap it by accessing either ``o.__wrapped__`` or ``o.func`` as
appropriate, until you have found the root unwrapped function.
* If ``o`` is a callable (but not a class), use
``o.__globals__`` as the globals when calling :func:`eval`.
:attr:`o.__globals__ <function.__globals__>` as the globals when calling
:func:`eval`.

However, not all string values used as annotations can
be successfully turned into Python values by :func:`eval`.
Expand Down
8 changes: 5 additions & 3 deletions Doc/howto/descriptor.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1295,7 +1295,8 @@ Using the non-data descriptor protocol, a pure Python version of
The :func:`functools.update_wrapper` call adds a ``__wrapped__`` attribute
that refers to the underlying function. Also it carries forward
the attributes necessary to make the wrapper look like the wrapped
function: ``__name__``, ``__qualname__``, ``__doc__``, and ``__annotations__``.
function: :attr:`~function.__name__`, :attr:`~function.__qualname__`,
:attr:`~function.__doc__`, and :attr:`~function.__annotations__`.

.. testcode::
:hide:
Expand Down Expand Up @@ -1506,8 +1507,9 @@ chained together. In Python 3.11, this functionality was deprecated.
The :func:`functools.update_wrapper` call in ``ClassMethod`` adds a
``__wrapped__`` attribute that refers to the underlying function. Also
it carries forward the attributes necessary to make the wrapper look
like the wrapped function: ``__name__``, ``__qualname__``, ``__doc__``,
and ``__annotations__``.
like the wrapped function: :attr:`~function.__name__`,
:attr:`~function.__qualname__`, :attr:`~function.__doc__`,
and :attr:`~function.__annotations__`.


Member objects and __slots__
Expand Down
5 changes: 3 additions & 2 deletions Doc/library/inspect.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1186,9 +1186,10 @@ Classes and functions
* If ``obj`` is a class, ``globals`` defaults to
``sys.modules[obj.__module__].__dict__`` and ``locals`` defaults
to the ``obj`` class namespace.
* If ``obj`` is a callable, ``globals`` defaults to ``obj.__globals__``,
* If ``obj`` is a callable, ``globals`` defaults to
:attr:`obj.__globals__ <function.__globals__>`,
although if ``obj`` is a wrapped function (using
``functools.update_wrapper()``) it is first unwrapped.
:func:`functools.update_wrapper`) it is first unwrapped.

Calling ``get_annotations`` is best practice for accessing the
annotations dict of any object. See :ref:`annotations-howto` for
Expand Down
6 changes: 3 additions & 3 deletions Doc/library/stdtypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5326,10 +5326,10 @@ Code objects are used by the implementation to represent "pseudo-compiled"
executable Python code such as a function body. They differ from function
objects because they don't contain a reference to their global execution
environment. Code objects are returned by the built-in :func:`compile` function
and can be extracted from function objects through their :attr:`__code__`
attribute. See also the :mod:`code` module.
and can be extracted from function objects through their
:attr:`~function.__code__` attribute. See also the :mod:`code` module.

Accessing ``__code__`` raises an :ref:`auditing event <auditing>`
Accessing :attr:`~function.__code__` raises an :ref:`auditing event <auditing>`
``object.__getattr__`` with arguments ``obj`` and ``"__code__"``.

.. index::
Expand Down
8 changes: 4 additions & 4 deletions Doc/library/xmlrpc.server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ alone XML-RPC servers.

Register a function that can respond to XML-RPC requests. If *name* is given,
it will be the method name associated with *function*, otherwise
``function.__name__`` will be used. *name* is a string, and may contain
:attr:`function.__name__` will be used. *name* is a string, and may contain
characters not legal in Python identifiers, including the period character.

This method can also be used as a decorator. When used as a decorator,
*name* can only be given as a keyword argument to register *function* under
*name*. If no *name* is given, ``function.__name__`` will be used.
*name*. If no *name* is given, :attr:`function.__name__` will be used.

.. versionchanged:: 3.7
:meth:`register_function` can be used as a decorator.
Expand Down Expand Up @@ -298,12 +298,12 @@ requests sent to Python CGI scripts.

Register a function that can respond to XML-RPC requests. If *name* is given,
it will be the method name associated with *function*, otherwise
``function.__name__`` will be used. *name* is a string, and may contain
:attr:`function.__name__` will be used. *name* is a string, and may contain
characters not legal in Python identifiers, including the period character.

This method can also be used as a decorator. When used as a decorator,
*name* can only be given as a keyword argument to register *function* under
*name*. If no *name* is given, ``function.__name__`` will be used.
*name*. If no *name* is given, :attr:`function.__name__` will be used.

.. versionchanged:: 3.7
:meth:`register_function` can be used as a decorator.
Expand Down
4 changes: 2 additions & 2 deletions Doc/reference/compound_stmts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1630,8 +1630,8 @@ body of a coroutine function.
are mappings.
.. [#] A string literal appearing as the first statement in the function body is
transformed into the function's ``__doc__`` attribute and therefore the
function's :term:`docstring`.
transformed into the function's :attr:`~function.__doc__` attribute and
therefore the function's :term:`docstring`.
.. [#] A string literal appearing as the first statement in the class body is
transformed into the namespace's ``__doc__`` item and therefore the class's
Expand Down
187 changes: 103 additions & 84 deletions Doc/reference/datamodel.rst
Original file line number Diff line number Diff line change
Expand Up @@ -534,99 +534,108 @@ section :ref:`function`). It should be called with an argument list
containing the same number of items as the function's formal parameter
list.

Special attributes:
Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
single: __closure__ (function attribute)
single: __globals__ (function attribute)
pair: global; namespace

.. list-table::
:header-rows: 1

.. tabularcolumns:: |l|L|l|
* - Attribute
- Meaning

* - .. attribute:: function.__globals__
- A reference to the :class:`dictionary <dict>` that holds the function's
:ref:`global variables <naming>` -- the global namespace of the module
in which the function was defined.

* - .. attribute:: function.__closure__
- ``None`` or a :class:`tuple` of cells that contain bindings for the
function's free variables.

A cell object has the attribute ``cell_contents``.
This can be used to get the value of the cell, as well as set the value.

Special writable attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
single: __doc__ (function attribute)
single: __name__ (function attribute)
single: __module__ (function attribute)
single: __dict__ (function attribute)
single: __defaults__ (function attribute)
single: __closure__ (function attribute)
single: __code__ (function attribute)
single: __globals__ (function attribute)
single: __annotations__ (function attribute)
single: __kwdefaults__ (function attribute)
pair: global; namespace

+-------------------------+-------------------------------+-----------+
| Attribute | Meaning | |
+=========================+===============================+===========+
| :attr:`__doc__` | The function's documentation | Writable |
| | string, or ``None`` if | |
| | unavailable; not inherited by | |
| | subclasses. | |
+-------------------------+-------------------------------+-----------+
| :attr:`~definition.\ | The function's name. | Writable |
| __name__` | | |
+-------------------------+-------------------------------+-----------+
| :attr:`~definition.\ | The function's | Writable |
| __qualname__` | :term:`qualified name`. | |
| | | |
| | .. versionadded:: 3.3 | |
+-------------------------+-------------------------------+-----------+
| :attr:`__module__` | The name of the module the | Writable |
| | function was defined in, or | |
| | ``None`` if unavailable. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__defaults__` | A tuple containing default | Writable |
| | argument values for those | |
| | arguments that have defaults, | |
| | or ``None`` if no arguments | |
| | have a default value. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__code__` | The code object representing | Writable |
| | the compiled function body. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__globals__` | A reference to the dictionary | Read-only |
| | that holds the function's | |
| | global variables --- the | |
| | global namespace of the | |
| | module in which the function | |
| | was defined. | |
+-------------------------+-------------------------------+-----------+
| :attr:`~object.__dict__`| The namespace supporting | Writable |
| | arbitrary function | |
| | attributes. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__closure__` | ``None`` or a tuple of cells | Read-only |
| | that contain bindings for the | |
| | function's free variables. | |
| | See below for information on | |
| | the ``cell_contents`` | |
| | attribute. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__annotations__` | A dict containing annotations | Writable |
| | of parameters. The keys of | |
| | the dict are the parameter | |
| | names, and ``'return'`` for | |
| | the return annotation, if | |
| | provided. For more | |
| | information on working with | |
| | this attribute, see | |
| | :ref:`annotations-howto`. | |
+-------------------------+-------------------------------+-----------+
| :attr:`__kwdefaults__` | A dict containing defaults | Writable |
| | for keyword-only parameters. | |
+-------------------------+-------------------------------+-----------+

Most of the attributes labelled "Writable" check the type of the assigned value.
Most of these attributes check the type of the assigned value:

.. list-table::
:header-rows: 1

* - Attribute
- Meaning

* - .. attribute:: function.__doc__
- The function's documentation string, or ``None`` if unavailable.
Not inherited by subclasses.

* - .. attribute:: function.__name__
- The function's name.
See also: :attr:`__name__ attributes <definition.__name__>`.

* - .. attribute:: function.__qualname__
- The function's :term:`qualified name`.
See also: :attr:`__qualname__ attributes <definition.__qualname__>`.

.. versionadded:: 3.3

* - .. attribute:: function.__module__
- The name of the module the function was defined in,
or ``None`` if unavailable.

* - .. attribute:: function.__defaults__
- A :class:`tuple` containing default parameter values
for those parameters that have defaults,
or ``None`` if no parameters have a default value.

* - .. attribute:: function.__code__
- The :ref:`code object <code-objects>` representing
the compiled function body.

* - .. attribute:: function.__dict__
- The namespace supporting arbitrary function attributes.
See also: :attr:`__dict__ attributes <object.__dict__>`.

* - .. attribute:: function.__annotations__
- A :class:`dictionary <dict>` containing annotations of parameters.
The keys of the dictionary are the parameter names,
and ``'return'`` for the return annotation, if provided.
See also: :ref:`annotations-howto`.

* - .. attribute:: function.__kwdefaults__
- A :class:`dictionary <dict>` containing defaults for keyword-only
parameters.

Function objects also support getting and setting arbitrary attributes, which
can be used, for example, to attach metadata to functions. Regular attribute
dot-notation is used to get and set such attributes. *Note that the current
implementation only supports function attributes on user-defined functions.
Function attributes on built-in functions may be supported in the future.*
dot-notation is used to get and set such attributes.

A cell object has the attribute ``cell_contents``. This can be used to get
the value of the cell, as well as set the value.
.. impl-detail::

CPython's current implementation only supports function attributes
on user-defined functions. Function attributes on
:ref:`built-in functions <builtin-functions>` may be supported in the
future.

Additional information about a function's definition can be retrieved from its
code object; see the description of internal types below. The
:data:`cell <types.CellType>` type can be accessed in the :mod:`types`
module.
:ref:`code object <code-objects>`
(accessible via the :attr:`~function.__code__` attribute).


.. _instance-methods:
Expand Down Expand Up @@ -658,15 +667,17 @@ Special read-only attributes:
:ref:`bound <method-binding>`

* - .. attribute:: method.__func__
- Refers to the original function object
- Refers to the original :ref:`function object <user-defined-funcs>`

* - .. attribute:: method.__doc__
- The method's documentation (same as :attr:`!method.__func__.__doc__`).
- The method's documentation
(same as :attr:`method.__func__.__doc__ <function.__doc__>`).
A :class:`string <str>` if the original function had a docstring, else
``None``.

* - .. attribute:: method.__name__
- The name of the method (same as :attr:`!method.__func__.__name__`)
- The name of the method
(same as :attr:`method.__func__.__name__ <function.__name__>`)

* - .. attribute:: method.__module__
- The name of the module the method was defined in, or ``None`` if
Expand Down Expand Up @@ -772,6 +783,8 @@ is raised and the asynchronous iterator will have reached the end of
the set of values to be yielded.


.. _builtin-functions:

Built-in functions
^^^^^^^^^^^^^^^^^^

Expand All @@ -784,10 +797,14 @@ A built-in function object is a wrapper around a C function. Examples of
built-in functions are :func:`len` and :func:`math.sin` (:mod:`math` is a
standard built-in module). The number and type of the arguments are
determined by the C function. Special read-only attributes:
:attr:`__doc__` is the function's documentation string, or ``None`` if
unavailable; :attr:`~definition.__name__` is the function's name; :attr:`__self__` is
set to ``None`` (but see the next item); :attr:`__module__` is the name of
the module the function was defined in or ``None`` if unavailable.

* :attr:`!__doc__` is the function's documentation string, or ``None`` if
unavailable. See :attr:`function.__doc__`.
* :attr:`!__name__` is the function's name. See :attr:`function.__name__`.
* :attr:`!__self__` is set to ``None`` (but see the next item).
* :attr:`!__module__` is the name of
the module the function was defined in or ``None`` if unavailable.
See :attr:`function.__module__`.


.. _builtin-methods:
Expand Down Expand Up @@ -837,7 +854,8 @@ the :ref:`import system <importsystem>` as invoked either by the
:keyword:`import` statement, or by calling
functions such as :func:`importlib.import_module` and built-in
:func:`__import__`. A module object has a namespace implemented by a
dictionary object (this is the dictionary referenced by the ``__globals__``
:class:`dictionary <dict>` object (this is the dictionary referenced by the
:attr:`~function.__globals__`
attribute of functions defined in the module). Attribute references are
translated to lookups in this dictionary, e.g., ``m.x`` is equivalent to
``m.__dict__["x"]``. A module object does not contain the code object used
Expand Down Expand Up @@ -1869,7 +1887,8 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances.
.. note::

This method may still be bypassed when looking up special methods as the
result of implicit invocation via language syntax or built-in functions.
result of implicit invocation via language syntax or
:ref:`built-in functions <builtin-functions>`.
See :ref:`special-lookup`.

.. audit-event:: object.__getattr__ obj,name object.__getattribute__
Expand Down
Loading

0 comments on commit f83087c

Please sign in to comment.