This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Why do we need `dis.Positions`?
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.11
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: BTaskaya, pablogsal, sobolevn
Priority: normal Keywords: patch

Created on 2022-01-18 12:30 by sobolevn, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 30716 merged sobolevn, 2022-01-20 07:37
Messages (4)
msg410855 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2022-01-18 12:30
While working on I've noticed that `Positions` namedtuple is kinda strange, source:

1. It is not used. `grep` shows that:

» ag Positions .  
21894:  treated as being relative to the end of the input string. Positions

1021:static PyTypeObject PositionsIterator = {
1067:    positionsiterator* pi = (positionsiterator*)PyType_GenericAlloc(&PositionsIterator, 0);

7:      <key>IBEditorPositions</key>

204:Positions = collections.namedtuple(
205:    'Positions',
239:_Instruction.positions.__doc__ = "dis.Positions object holding the span of source code covered by this instruction"
259:         positions - Optional dis.Positions object holding the span of source code

1013:class TestSourcePositions(unittest.TestCase):

1579:Finding all Adverbs and their Positions

2. Commenting it out does not make `test_dis` to fail (again, because it does not seem to be used)
3. It is documented (in docstrings only, not in `dis.rst`) that `Instruction.positions` is `dis.Positions`, but this is not true. Because `Instruction` is created as:

co_positions = co_positions or iter(())

  positions = next(co_positions)
except StopIteration:
  positions = None


So, it is at best is `tuple | None`. Never `Positions`.

What to do with it?
1. Should it be removed as unused, undocumented, and unreleased?
2. Should it be used as documented? Here:
3. Any other ideas?

In my opinion, it is not required, because we already have `codeobject.co_positions` which is pretty much the same thing:

I would like to work on it after a final decision is made :)
msg410927 - (view) Author: Batuhan Taskaya (BTaskaya) * (Python committer) Date: 2022-01-19 08:52
The initial aim of the dis.Positions was to provide an interface like AST nodes. So you could do

for instr in dis.Bytecode(source):
    print("located in: ", instr.positions.lineno)

instead of

for instr in dis.Bytecode(source):
    if instr.positions:
        lineno = instr.positions[0]
        lineno = None
    print("located in: ", lineno)

I think this is a bug that we are not currently using it, I'd say we should use it properly and go with option 2.
msg410935 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2022-01-19 10:41
Ok then, I will send my option `2` proposal to fix this later today.
msg411466 - (view) Author: Batuhan Taskaya (BTaskaya) * (Python committer) Date: 2022-01-24 11:09
New changeset 58f3d980989c7346ad792d464c1d749dcec6af63 by Nikita Sobolev in branch 'main':
bpo-46422: use `dis.Positions` in `dis.Instruction` (GH-30716)
Date User Action Args
2022-04-11 14:59:54adminsetgithub: 90580
2022-01-24 11:27:21sobolevnsetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2022-01-24 11:09:25BTaskayasetmessages: + msg411466
2022-01-20 07:37:23sobolevnsetkeywords: + patch
stage: patch review
pull_requests: + pull_request28908
2022-01-19 10:41:07sobolevnsetmessages: + msg410935
2022-01-19 08:52:55BTaskayasetmessages: + msg410927
2022-01-18 12:30:08sobolevncreate