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.
Created on 2018年08月10日 15:02 by Arusekk, last changed 2022年04月11日 14:59 by admin. This issue is now closed.
| Messages (3) | |||
|---|---|---|---|
| msg323371 - (view) | Author: (Arusekk) * | Date: 2018年08月10日 15:02 | |
If this is a duplicate, please excuse me.
In particular, the most noticeable inaccuracy happens when the postfix if-else expression is involved. Maybe there are more of them.
The problem is quite self-explaining. The module named 'dis' will be helpful to reproduce the issue.
>>> import dis
>>> code = """(
... [
... call1(),
... call2()
... ]
... + call3()
... * call4()
... )"""
>>> dis.dis(code)
3 0 LOAD_NAME 0 (call1)
3 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
4 6 LOAD_NAME 1 (call2)
9 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
12 BUILD_LIST 2
6 15 LOAD_NAME 2 (call3)
18 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
7 21 LOAD_NAME 3 (call4)
24 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
27 BINARY_MULTIPLY
28 BINARY_ADD
29 RETURN_VALUE
>>> dis.dis(code.replace("+", "if").replace("*", "else"))
6 0 LOAD_NAME 0 (call3)
3 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
6 POP_JUMP_IF_FALSE 25
9 LOAD_NAME 1 (call1)
12 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
15 LOAD_NAME 2 (call2)
18 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
21 BUILD_LIST 2
24 RETURN_VALUE
7 >> 25 LOAD_NAME 3 (call4)
28 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
31 RETURN_VALUE
I used this code to show the difference between if-else and some arithmetics.
AFAICT the feature is possible to implement, as lnotab can contain negative line differences.
I don't know whether it is just a bug or a fully intended feature, but it would be quite an enhancement to have better line number tracking, useful for debugging.
If this is implemented, it may be worth further backporting.
Possible reasons in the upstream Python/compile.c (using < instead of !=):
https://github.com/python/cpython/blob/077059e0f086cf8c8b7fb9d1f053e38ddc743f59/Python/compile.c#L4092
https://github.com/python/cpython/blob/077059e0f086cf8c8b7fb9d1f053e38ddc743f59/Python/compile.c#L4438
|
|||
| msg323556 - (view) | Author: Ammar Askar (ammar2) * (Python committer) | Date: 2018年08月15日 07:45 | |
Note that even just adding an extra arithmetic in your first expression breaks the line numbers: >>> code = """( ... [ ... call1(), ... call2() ... ] ... + call3() ... * call4() ... + call5() ... )""" >>> dis.dis(code) 8 0 LOAD_NAME 0 (call1) 2 CALL_FUNCTION 0 4 LOAD_NAME 1 (call2) 6 CALL_FUNCTION 0 8 BUILD_LIST 2 10 LOAD_NAME 2 (call3) 12 CALL_FUNCTION 0 14 LOAD_NAME 3 (call4) 16 CALL_FUNCTION 0 18 BINARY_MULTIPLY 20 BINARY_ADD 22 LOAD_NAME 4 (call5) 24 CALL_FUNCTION 0 26 BINARY_ADD 28 RETURN_VALUE The closest existing bug to this would be issue 12458, specifically with Serhiy's last comment. |
|||
| msg323577 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2018年08月15日 18:00 | |
If the proposed solution for issue12458 be merged, this issue will be closed as a duplicate. Otherwise I have a simpler solution for this particular case (and few other cases, but not all cases in issue12458). |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:59:04 | admin | set | github: 78553 |
| 2018年09月24日 16:39:23 | serhiy.storchaka | set | status: open -> closed superseder: Tracebacks should contain the first line of continuation lines stage: resolved resolution: duplicate versions: - Python 3.7 |
| 2018年08月15日 18:00:44 | serhiy.storchaka | set | messages: + msg323577 |
| 2018年08月15日 10:45:03 | serhiy.storchaka | set | assignee: serhiy.storchaka nosy: + serhiy.storchaka |
| 2018年08月15日 07:49:02 | ammar2 | set | title: Compiler could output more accurate line numbers -> Parenthesized expression has incorrect line numbers |
| 2018年08月15日 07:45:04 | ammar2 | set | nosy:
+ ammar2 messages: + msg323556 |
| 2018年08月10日 15:02:24 | Arusekk | create | |