1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
About linetable
---------------
.. image:: https://github.com/amol-/linetable/actions/workflows/run-tests.yml/badge.svg
:target: https://github.com/amol-/linetable/actions/workflows/run-tests.yml
.. image:: https://coveralls.io/repos/amol-/linetable/badge.svg
:target: https://coveralls.io/r/amol-/linetable
.. image:: https://img.shields.io/pypi/v/linetable.svg
:target: https://pypi.python.org/pypi/linetable
.. image:: https://img.shields.io/pypi/pyversions/linetable.svg
:target: https://pypi.python.org/pypi/linetable
.. image:: https://img.shields.io/pypi/l/linetable.svg
:target: https://pypi.python.org/pypi/linetable
linetable is a library parse and generate co_linetable attributes in Python code objects.
Based on https://github.com/python/cpython/blob/main/Objects/locations.md
Installing
----------
linetable can be installed from pypi::
pip install linetable
should just work for most of the users
Usage
-----
Existing linetable can be parsed using ``linetable.parse_linetable``::
>>> def testfunc():
... x = 3
... y = x + 1
... return y
>>> list(linetable.parse_linetable(testfunc.__code__.co_linetable))
[
(1, 1, 1, 0, 0),
(1, 2, 2, 6, 7),
(1, 2, 2, 2, 3),
(1, 3, 3, 6, 7),
(1, 3, 3, 10, 11),
(2, 3, 3, 6, 11),
(1, 3, 3, 2, 3),
(1, 4, 4, 9, 10),
(1, 4, 4, 2, 10),
]
If you prefer the output in the format of ``dis.Positions`` objects,
you can create them from the yielded values::
>>> [dis.Positions(*e[1:]) for e in linetable.parse_linetable(testfunc.__code__.co_linetable)]
[Positions(lineno=1, end_lineno=1, col_offset=0, end_col_offset=0), Positions(lineno=2, end_lineno=2, col_offset=8, end_col_offset=9), Positions(lineno=2, end_lineno=2, col_offset=4, end_col_offset=5), Positions(lineno=3, end_lineno=3, col_offset=8, end_col_offset=9), Positions(lineno=3, end_lineno=3, col_offset=12, end_col_offset=13), Positions(lineno=3, end_lineno=3, col_offset=8, end_col_offset=13), Positions(lineno=3, end_lineno=3, col_offset=4, end_col_offset=5), Positions(lineno=4, end_lineno=4, col_offset=11, end_col_offset=12), Positions(lineno=4, end_lineno=4, col_offset=4, end_col_offset=12)]
If you have the linetable, you can generate back the binary encoded version
using ``linetable.generate_linetable``::
>>> lt = [
... (1, 1, 1, 0, 0),
... (1, 2, 2, 6, 7),
... (1, 2, 2, 2, 3),
... (1, 3, 3, 6, 7),
... (1, 3, 3, 10, 11),
... (2, 3, 3, 6, 11),
... (1, 3, 3, 2, 3),
... (1, 4, 4, 9, 10),
... (1, 4, 4, 2, 10),
... ]
>>> linetable.generate_linetable(lt)
b"\x80\x00\xd8\x06\x07\x80!\xd8\x06\x07\x88!\x81e\x80!\xd8\t\n\x80("
|