Skip to content

Commit d3f2051

Browse files
AlexWaygoodhugovk
andauthored
[3.12] Document the co_lines method on code objects (#113682) (#113686)
(cherry-picked from commit f1f8392) Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
1 parent d2cdc67 commit d3f2051

File tree

5 files changed

+49
-11
lines changed

5 files changed

+49
-11
lines changed

Doc/library/dis.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,17 +316,18 @@ operation is being performed, so the intermediate analysis object isn't useful:
316316

317317
.. function:: findlinestarts(code)
318318

319-
This generator function uses the ``co_lines`` method
320-
of the code object *code* to find the offsets which are starts of
319+
This generator function uses the :meth:`~codeobject.co_lines` method
320+
of the :ref:`code object <code-objects>` *code* to find the offsets which
321+
are starts of
321322
lines in the source code. They are generated as ``(offset, lineno)`` pairs.
322323

323324
.. versionchanged:: 3.6
324325
Line numbers can be decreasing. Before, they were always increasing.
325326

326327
.. versionchanged:: 3.10
327-
The :pep:`626` ``co_lines`` method is used instead of the
328+
The :pep:`626` :meth:`~codeobject.co_lines` method is used instead of the
328329
:attr:`~codeobject.co_firstlineno` and :attr:`~codeobject.co_lnotab`
329-
attributes of the code object.
330+
attributes of the :ref:`code object <code-objects>`.
330331

331332

332333
.. function:: findlabels(code)

Doc/reference/datamodel.rst

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,8 +1219,8 @@ If a code object represents a function, the first item in
12191219
:attr:`~codeobject.co_consts` is
12201220
the documentation string of the function, or ``None`` if undefined.
12211221

1222-
The :meth:`!co_positions` method
1223-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1222+
Methods on code objects
1223+
~~~~~~~~~~~~~~~~~~~~~~~
12241224

12251225
.. method:: codeobject.co_positions()
12261226

@@ -1255,6 +1255,41 @@ The :meth:`!co_positions` method
12551255
:option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES`
12561256
environment variable can be used.
12571257

1258+
.. method:: codeobject.co_lines()
1259+
1260+
Returns an iterator that yields information about successive ranges of
1261+
:term:`bytecode`\s. Each item yielded is a ``(start, end, lineno)``
1262+
:class:`tuple`:
1263+
1264+
* ``start`` (an :class:`int`) represents the offset (inclusive) of the start
1265+
of the :term:`bytecode` range
1266+
* ``end`` (an :class:`int`) represents the offset (inclusive) of the end of
1267+
the :term:`bytecode` range
1268+
* ``lineno`` is an :class:`int` representing the line number of the
1269+
:term:`bytecode` range, or ``None`` if the bytecodes in the given range
1270+
have no line number
1271+
1272+
The items yielded generated will have the following properties:
1273+
1274+
* The first range yielded will have a ``start`` of 0.
1275+
* The ``(start, end)`` ranges will be non-decreasing and consecutive. That
1276+
is, for any pair of :class:`tuple`\s, the ``start`` of the second will be
1277+
equal to the ``end`` of the first.
1278+
* No range will be backwards: ``end >= start`` for all triples.
1279+
* The :class:`tuple` yielded will have ``end`` equal to the size of the
1280+
:term:`bytecode`.
1281+
1282+
Zero-width ranges, where ``start == end``, are allowed. Zero-width ranges
1283+
are used for lines that are present in the source code, but have been
1284+
eliminated by the :term:`bytecode` compiler.
1285+
1286+
.. versionadded:: 3.10
1287+
1288+
.. seealso::
1289+
1290+
:pep:`626` - Precise line numbers for debugging and other tools.
1291+
The PEP that introduced the :meth:`!co_lines` method.
1292+
12581293

12591294
.. _frame-objects:
12601295

Doc/whatsnew/3.10.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,11 @@ Tracing events, with the correct line number, are generated for all lines of cod
402402
The :attr:`~frame.f_lineno` attribute of frame objects will always contain the
403403
expected line number.
404404
405-
The :attr:`~codeobject.co_lnotab` attribute of code objects is deprecated and
405+
The :attr:`~codeobject.co_lnotab` attribute of
406+
:ref:`code objects <code-objects>` is deprecated and
406407
will be removed in 3.12.
407-
Code that needs to convert from offset to line number should use the new ``co_lines()`` method instead.
408+
Code that needs to convert from offset to line number should use the new
409+
:meth:`~codeobject.co_lines` method instead.
408410
409411
PEP 634: Structural Pattern Matching
410412
------------------------------------

Misc/NEWS.d/3.12.0a4.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ clinic.
147147
.. nonce: yRWQ1y
148148
.. section: Core and Builtins
149149
150-
Improve the output of ``co_lines`` by emitting only one entry for each line
151-
range.
150+
Improve the output of :meth:`codeobject.co_lines` by emitting only one entry
151+
for each line range.
152152

153153
..
154154

Objects/lnotab_notes.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Final form:
5757
Iterating over the table.
5858
-------------------------
5959

60-
For the `co_lines` attribute we want to emit the full form, omitting the (350, 360, No line number) and empty entries.
60+
For the `co_lines` method we want to emit the full form, omitting the (350, 360, No line number) and empty entries.
6161

6262
The code is as follows:
6363

0 commit comments

Comments
 (0)