gh-101100: Improve documentation of code object attributes (#112781)

This commit is contained in:
Alex Waygood 2023-12-06 20:15:46 +00:00 committed by GitHub
parent b920d6ceaa
commit e9707d3c3d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 112 additions and 53 deletions

View file

@ -37,7 +37,7 @@ There are a few functions specific to Python functions.
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. *__module__*
is retrieved from *globals*. The argument defaults, annotations and closure are 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 set to ``NULL``. *__qualname__* is set to the same value as the code object's
``co_qualname`` field. :attr:`~codeobject.co_qualname` field.
.. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) .. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
@ -45,7 +45,7 @@ There are a few functions specific to Python functions.
As :c:func:`PyFunction_New`, but also allows setting the function object's As :c:func:`PyFunction_New`, but also allows setting the function object's
``__qualname__`` attribute. *qualname* should be a unicode object or ``NULL``; ``__qualname__`` attribute. *qualname* should be a unicode object or ``NULL``;
if ``NULL``, the ``__qualname__`` attribute is set to the same value as the if ``NULL``, the ``__qualname__`` attribute is set to the same value as the
code object's ``co_qualname`` field. code object's :attr:`~codeobject.co_qualname` field.
.. versionadded:: 3.3 .. versionadded:: 3.3

View file

@ -154,7 +154,7 @@ Importing Modules
:class:`~importlib.machinery.SourceFileLoader` otherwise. :class:`~importlib.machinery.SourceFileLoader` otherwise.
The module's :attr:`__file__` attribute will be set to the code object's The module's :attr:`__file__` attribute will be set to the code object's
:attr:`!co_filename`. If applicable, :attr:`__cached__` will also :attr:`~codeobject.co_filename`. If applicable, :attr:`__cached__` will also
be set. be set.
This function will reload the module if it was already imported. See This function will reload the module if it was already imported. See

View file

@ -346,8 +346,9 @@ operation is being performed, so the intermediate analysis object isn't useful:
Line numbers can be decreasing. Before, they were always increasing. Line numbers can be decreasing. Before, they were always increasing.
.. versionchanged:: 3.10 .. versionchanged:: 3.10
The :pep:`626` ``co_lines`` method is used instead of the ``co_firstlineno`` The :pep:`626` ``co_lines`` method is used instead of the
and ``co_lnotab`` attributes of the code object. :attr:`~codeobject.co_firstlineno` and :attr:`~codeobject.co_lnotab`
attributes of the code object.
.. versionchanged:: 3.13 .. versionchanged:: 3.13
Line numbers can be ``None`` for bytecode that does not map to source lines. Line numbers can be ``None`` for bytecode that does not map to source lines.
@ -983,13 +984,13 @@ iterations of the loop.
.. opcode:: STORE_NAME (namei) .. opcode:: STORE_NAME (namei)
Implements ``name = STACK.pop()``. *namei* is the index of *name* in the attribute Implements ``name = STACK.pop()``. *namei* is the index of *name* in the attribute
:attr:`!co_names` of the :ref:`code object <code-objects>`. :attr:`~codeobject.co_names` of the :ref:`code object <code-objects>`.
The compiler tries to use :opcode:`STORE_FAST` or :opcode:`STORE_GLOBAL` if possible. The compiler tries to use :opcode:`STORE_FAST` or :opcode:`STORE_GLOBAL` if possible.
.. opcode:: DELETE_NAME (namei) .. opcode:: DELETE_NAME (namei)
Implements ``del name``, where *namei* is the index into :attr:`!co_names` Implements ``del name``, where *namei* is the index into :attr:`~codeobject.co_names`
attribute of the :ref:`code object <code-objects>`. attribute of the :ref:`code object <code-objects>`.
@ -1029,7 +1030,7 @@ iterations of the loop.
value = STACK.pop() value = STACK.pop()
obj.name = value obj.name = value
where *namei* is the index of name in :attr:`!co_names` of the where *namei* is the index of name in :attr:`~codeobject.co_names` of the
:ref:`code object <code-objects>`. :ref:`code object <code-objects>`.
.. opcode:: DELETE_ATTR (namei) .. opcode:: DELETE_ATTR (namei)
@ -1039,7 +1040,7 @@ iterations of the loop.
obj = STACK.pop() obj = STACK.pop()
del obj.name del obj.name
where *namei* is the index of name into :attr:`!co_names` of the where *namei* is the index of name into :attr:`~codeobject.co_names` of the
:ref:`code object <code-objects>`. :ref:`code object <code-objects>`.
@ -1402,7 +1403,7 @@ iterations of the loop.
Pushes a reference to the object the cell contains on the stack. Pushes a reference to the object the cell contains on the stack.
.. versionchanged:: 3.11 .. versionchanged:: 3.11
``i`` is no longer offset by the length of ``co_varnames``. ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
.. opcode:: LOAD_FROM_DICT_OR_DEREF (i) .. opcode:: LOAD_FROM_DICT_OR_DEREF (i)
@ -1424,7 +1425,7 @@ iterations of the loop.
storage. storage.
.. versionchanged:: 3.11 .. versionchanged:: 3.11
``i`` is no longer offset by the length of ``co_varnames``. ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
.. opcode:: DELETE_DEREF (i) .. opcode:: DELETE_DEREF (i)
@ -1435,7 +1436,7 @@ iterations of the loop.
.. versionadded:: 3.2 .. versionadded:: 3.2
.. versionchanged:: 3.11 .. versionchanged:: 3.11
``i`` is no longer offset by the length of ``co_varnames``. ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
.. opcode:: COPY_FREE_VARS (n) .. opcode:: COPY_FREE_VARS (n)

View file

@ -1596,8 +1596,8 @@ updated as expected:
Code Objects Bit Flags Code Objects Bit Flags
---------------------- ----------------------
Python code objects have a ``co_flags`` attribute, which is a bitmap of Python code objects have a :attr:`~codeobject.co_flags` attribute,
the following flags: which is a bitmap of the following flags:
.. data:: CO_OPTIMIZED .. data:: CO_OPTIMIZED

View file

@ -1077,57 +1077,111 @@ indirectly) to mutable objects.
single: co_freevars (code object attribute) single: co_freevars (code object attribute)
single: co_qualname (code object attribute) single: co_qualname (code object attribute)
Special read-only attributes: :attr:`co_name` gives the function name; Special read-only attributes
:attr:`co_qualname` gives the fully qualified function name; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:attr:`co_argcount` is the total number of positional arguments
(including positional-only arguments and arguments with default values); .. list-table::
:attr:`co_posonlyargcount` is the number of positional-only arguments
(including arguments with default values); :attr:`co_kwonlyargcount` is * - .. attribute:: codeobject.co_name
the number of keyword-only arguments (including arguments with default - The function name
values); :attr:`co_nlocals` is the number of local variables used by the
function (including arguments); :attr:`co_varnames` is a tuple containing * - .. attribute:: codeobject.co_qualname
the names of the local variables (starting with the argument names); - The fully qualified function name
:attr:`co_cellvars` is a tuple containing the names of local variables
that are referenced by nested functions; :attr:`co_freevars` is a tuple * - .. attribute:: codeobject.co_argcount
containing the names of free variables; :attr:`co_code` is a string - The total number of positional :term:`parameters <parameter>`
representing the sequence of bytecode instructions; :attr:`co_consts` is (including positional-only parameters and parameters with default values)
a tuple containing the literals used by the bytecode; :attr:`co_names` is that the function has
a tuple containing the names used by the bytecode; :attr:`co_filename` is
the filename from which the code was compiled; :attr:`co_firstlineno` is * - .. attribute:: codeobject.co_posonlyargcount
the first line number of the function; :attr:`co_lnotab` is a string - The number of positional-only :term:`parameters <parameter>`
encoding the mapping from bytecode offsets to line numbers (for details (including arguments with default values) that the function has
see the source code of the interpreter, is deprecated since 3.12
and may be removed in 3.14); :attr:`co_stacksize` is the * - .. attribute:: codeobject.co_kwonlyargcount
required stack size; :attr:`co_flags` is an integer encoding a number - The number of keyword-only :term:`parameters <parameter>`
of flags for the interpreter. (including arguments with default values) that the function has
* - .. attribute:: codeobject.co_nlocals
- The number of :ref:`local variables <naming>` used by the function
(including parameters)
* - .. attribute:: codeobject.co_varnames
- A :class:`tuple` containing the names of the local variables in the
function (starting with the parameter names)
* - .. attribute:: codeobject.co_cellvars
- A :class:`tuple` containing the names of :ref:`local variables <naming>`
that are referenced by nested functions inside the function
* - .. attribute:: codeobject.co_freevars
- A :class:`tuple` containing the names of free variables in the function
* - .. attribute:: codeobject.co_code
- A string representing the sequence of :term:`bytecode` instructions in
the function
* - .. attribute:: codeobject.co_consts
- A :class:`tuple` containing the literals used by the :term:`bytecode` in
the function
* - .. attribute:: codeobject.co_names
- A :class:`tuple` containing the names used by the :term:`bytecode` in
the function
* - .. attribute:: codeobject.co_filename
- The name of the file from which the code was compiled
* - .. attribute:: codeobject.co_firstlineno
- The line number of the first line of the function
* - .. attribute:: codeobject.co_lnotab
- A string encoding the mapping from :term:`bytecode` offsets to line
numbers. For details, see the source code of the interpreter.
.. deprecated:: 3.12
This attribute of code objects is deprecated, and may be removed in
Python 3.14.
* - .. attribute:: codeobject.co_stacksize
- The required stack size of the code object
* - .. attribute:: codeobject.co_flags
- An :class:`integer <int>` encoding a number of flags for the
interpreter.
.. index:: pair: object; generator .. index:: pair: object; generator
The following flag bits are defined for :attr:`co_flags`: bit ``0x04`` is set if The following flag bits are defined for :attr:`~codeobject.co_flags`:
bit ``0x04`` is set if
the function uses the ``*arguments`` syntax to accept an arbitrary number of the function uses the ``*arguments`` syntax to accept an arbitrary number of
positional arguments; bit ``0x08`` is set if the function uses the positional arguments; bit ``0x08`` is set if the function uses the
``**keywords`` syntax to accept arbitrary keyword arguments; bit ``0x20`` is set ``**keywords`` syntax to accept arbitrary keyword arguments; bit ``0x20`` is set
if the function is a generator. if the function is a generator. See :ref:`inspect-module-co-flags` for details
on the semantics of each flags that might be present.
Future feature declarations (``from __future__ import division``) also use bits Future feature declarations (``from __future__ import division``) also use bits
in :attr:`co_flags` to indicate whether a code object was compiled with a in :attr:`~codeobject.co_flags` to indicate whether a code object was compiled with a
particular feature enabled: bit ``0x2000`` is set if the function was compiled particular feature enabled: bit ``0x2000`` is set if the function was compiled
with future division enabled; bits ``0x10`` and ``0x1000`` were used in earlier with future division enabled; bits ``0x10`` and ``0x1000`` were used in earlier
versions of Python. versions of Python.
Other bits in :attr:`co_flags` are reserved for internal use. Other bits in :attr:`~codeobject.co_flags` are reserved for internal use.
.. index:: single: documentation string .. index:: single: documentation string
If a code object represents a function, the first item in :attr:`co_consts` is If a code object represents a function, the first item in
:attr:`~codeobject.co_consts` is
the documentation string of the function, or ``None`` if undefined. the documentation string of the function, or ``None`` if undefined.
The :meth:`!co_positions` method
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. method:: codeobject.co_positions() .. method:: codeobject.co_positions()
Returns an iterable over the source code positions of each bytecode Returns an iterable over the source code positions of each :term:`bytecode`
instruction in the code object. instruction in the code object.
The iterator returns tuples containing the ``(start_line, end_line, The iterator returns :class:`tuple`\s containing the ``(start_line, end_line,
start_column, end_column)``. The *i-th* tuple corresponds to the start_column, end_column)``. The *i-th* tuple corresponds to the
position of the source code that compiled to the *i-th* instruction. position of the source code that compiled to the *i-th* instruction.
Column information is 0-indexed utf-8 byte offsets on the given source Column information is 0-indexed utf-8 byte offsets on the given source

View file

@ -2405,7 +2405,7 @@ Other Changes and Fixes
:issue:`5464`.) :issue:`5464`.)
* When importing a module from a :file:`.pyc` or :file:`.pyo` file * When importing a module from a :file:`.pyc` or :file:`.pyo` file
with an existing :file:`.py` counterpart, the :attr:`co_filename` with an existing :file:`.py` counterpart, the :attr:`~codeobject.co_filename`
attributes of the resulting code objects are overwritten when the attributes of the resulting code objects are overwritten when the
original filename is obsolete. This can happen if the file has been original filename is obsolete. This can happen if the file has been
renamed, moved, or is accessed through different paths. (Patch by renamed, moved, or is accessed through different paths. (Patch by

View file

@ -402,7 +402,8 @@ Tracing events, with the correct line number, are generated for all lines of cod
The :attr:`~frame.f_lineno` attribute of frame objects will always contain the The :attr:`~frame.f_lineno` attribute of frame objects will always contain the
expected line number. expected line number.
The ``co_lnotab`` attribute of code objects is deprecated and will be removed in 3.12. The :attr:`~codeobject.co_lnotab` attribute of code objects is deprecated and
will be removed in 3.12.
Code that needs to convert from offset to line number should use the new ``co_lines()`` method instead. Code that needs to convert from offset to line number should use the new ``co_lines()`` method instead.
PEP 634: Structural Pattern Matching PEP 634: Structural Pattern Matching

View file

@ -1323,7 +1323,8 @@ Deprecated
``int``, convert to int explicitly: ``~int(x)``. (Contributed by Tim Hoffmann ``int``, convert to int explicitly: ``~int(x)``. (Contributed by Tim Hoffmann
in :gh:`103487`.) in :gh:`103487`.)
* Accessing ``co_lnotab`` on code objects was deprecated in Python 3.10 via :pep:`626`, * Accessing :attr:`~codeobject.co_lnotab` on code objects was deprecated in
Python 3.10 via :pep:`626`,
but it only got a proper :exc:`DeprecationWarning` in 3.12, but it only got a proper :exc:`DeprecationWarning` in 3.12,
therefore it will be removed in 3.14. therefore it will be removed in 3.14.
(Contributed by Nikita Sobolev in :gh:`101866`.) (Contributed by Nikita Sobolev in :gh:`101866`.)
@ -1430,7 +1431,7 @@ and will be removed in Python 3.14.
* The ``__package__`` and ``__cached__`` attributes on module objects. * The ``__package__`` and ``__cached__`` attributes on module objects.
* The ``co_lnotab`` attribute of code objects. * The :attr:`~codeobject.co_lnotab` attribute of code objects.
Pending Removal in Python 3.15 Pending Removal in Python 3.15
------------------------------ ------------------------------

View file

@ -572,7 +572,8 @@ Pending Removal in Python 3.14
* date and datetime adapter, date and timestamp converter: * date and datetime adapter, date and timestamp converter:
see the :mod:`sqlite3` documentation for suggested replacement recipes. see the :mod:`sqlite3` documentation for suggested replacement recipes.
* :class:`types.CodeType`: Accessing ``co_lnotab`` was deprecated in :pep:`626` * :class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was
deprecated in :pep:`626`
since 3.10 and was planned to be removed in 3.12, since 3.10 and was planned to be removed in 3.12,
but it only got a proper :exc:`DeprecationWarning` in 3.12. but it only got a proper :exc:`DeprecationWarning` in 3.12.
May be removed in 3.14. May be removed in 3.14.
@ -735,7 +736,7 @@ although there is currently no date scheduled for their removal.
* :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules. * :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules.
* ``types.CodeType.co_lnotab``: use the ``co_lines`` attribute instead. * :attr:`~codeobject.co_lnotab`: use the ``co_lines`` attribute instead.
* :class:`typing.Text` (:gh:`92332`). * :class:`typing.Text` (:gh:`92332`).

View file

@ -2160,14 +2160,15 @@ Changes in the Python API
* :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg** * :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg**
argument is not set. Previously only ``NULL`` was returned. argument is not set. Previously only ``NULL`` was returned.
* The format of the ``co_lnotab`` attribute of code objects changed to support * The format of the :attr:`~codeobject.co_lnotab` attribute of code objects
changed to support
a negative line number delta. By default, Python does not emit bytecode with a negative line number delta. By default, Python does not emit bytecode with
a negative line number delta. Functions using :attr:`frame.f_lineno`, a negative line number delta. Functions using :attr:`frame.f_lineno`,
``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected. ``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected.
Functions directly decoding ``co_lnotab`` should be updated to use a signed Functions directly decoding :attr:`!co_lnotab` should be updated to use a signed
8-bit integer type for the line number delta, but this is only required to 8-bit integer type for the line number delta, but this is only required to
support applications using a negative line number delta. See support applications using a negative line number delta. See
``Objects/lnotab_notes.txt`` for the ``co_lnotab`` format and how to decode ``Objects/lnotab_notes.txt`` for the :attr:`!co_lnotab` format and how to decode
it, and see the :pep:`511` for the rationale. it, and see the :pep:`511` for the rationale.
* The functions in the :mod:`compileall` module now return booleans instead * The functions in the :mod:`compileall` module now return booleans instead