classification
Title: Erroneous suggestion in print statement
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 3.7, Python 3.6
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: CuriousLearner, cheryl.sabella, ncoghlan, nitishch, serhiy.storchaka, storymode7
Priority: normal Keywords: patch

Created on 2018-01-27 10:31 by storymode7, last changed 2018-01-28 11:33 by ncoghlan. This issue is now closed.

Files
File name Uploaded Description Edit
printBug.py storymode7, 2018-01-27 10:31
Pull Requests
URL Status Linked Edit
PR 5375 merged nitishch, 2018-01-28 07:34
PR 5376 closed CuriousLearner, 2018-01-28 07:35
PR 5380 merged miss-islington, 2018-01-28 10:57
Messages (9)
msg310852 - (view) Author: Mayank Singhal (storymode7) * Date: 2018-01-27 10:31
The suggestion given when a for and print with the syntax for python 2.x are used together seems erroneous.

Steps to reproduce:
Just type following in the python interpreter (3.x):


for p in some_list: print p


The error produced is:

SyntaxError: Missing parentheses in call to 'print'. Did you mean print(in some_list: print p)?

I am also attaching a small file, that produces the error when run with:

python3 printBug.py
msg310853 - (view) Author: Cheryl Sabella (cheryl.sabella) * (Python committer) Date: 2018-01-27 11:13
Thank you for the report.  The change to the exception message was added in #30597, but it looks like it may be too greedy.  Adding the developer to the nosy list.
msg310855 - (view) Author: Sanyam Khurana (CuriousLearner) * (Python triager) Date: 2018-01-27 11:20
Thanks for the report Mayank!

As we discussed offline, it is indeed reproducible if someone uses `print` on the same line (such as in this case, where a loop is used).

I will look into this issue.
msg310857 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-27 13:20
Re-reading the code for _set_legacy_print_statement_msg, I noticed that we're not currently taking the "start" parameter into account, and that's the offset the compiler passes in to tell us where on the line it found the text "print ". Oops :)

We're also currently going to mishandle code like "x = 1; print x; pass" as well: the suggestion for that is "print(x)", but we would currently suggest "print(print x; pass)".

Fixing the left offset shouldn't be too difficult, as I believe the correct value for that is just "PRINT_OFFSET + start".

For the right offset, I think we'll want to drop the initial XStrip call added for bpo-32028 entirely, and instead calculate the right offset as a PyUnicode_FindChar search for ";" (replacing it with the length of the input string if the separator isn't found).

Any trailing whitespace (either before the ";", if one is present, or before the end of the line otherwise) will then be stripped by the remaining XStrip call (the one after the PyUnicode_Substring call).

(Even with those improvements, there will still be cases where the heuristic gives an incorrect suggestion due to a syntax error within the expression to be displayed, like "print value:", but there isn't anything simple we can do about those short of trying to compile the calculated suggestion, and I'm not prepared to go that far yet)
msg310899 - (view) Author: Nitish (nitishch) * Date: 2018-01-27 23:49
> For the right offset, I think we'll want to drop the initial XStrip call added for bpo-32028 entirely, and instead calculate the right offset as a PyUnicode_FindChar search for ";" (replacing it with the length of the input string if the separator isn't found).

Are ';' and whitespace the only allowed characters following the print expression?
msg310920 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-28 05:12
They're the only characters we won't want to include as part of the suggestion, since they indicate the end of the statement.
msg310934 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-28 10:56
New changeset 43c0f1ac5ed8bc9c3bd048d2ce4de4c98a83de99 by Nick Coghlan (Nitish Chandra) in branch 'master':
bpo-32685: Improve suggestion for print statement (GH-5375)
https://github.com/python/cpython/commit/43c0f1ac5ed8bc9c3bd048d2ce4de4c98a83de99
msg310937 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-28 11:31
New changeset b3b4b81d0147534151941105eba4af984acdc763 by Nick Coghlan (Miss Islington (bot)) in branch '3.6':
bpo-32685: Improve suggestion for print statement (GH-5380)
https://github.com/python/cpython/commit/b3b4b81d0147534151941105eba4af984acdc763
msg310938 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-28 11:33
Thanks for the patches, Sanyam & Nitish, and for the original bug report Mayank.

Thanks also to Cheryl for nudging us to get it resolved :)
History
Date User Action Args
2018-01-28 11:33:27ncoghlansetstatus: open -> closed
resolution: fixed
messages: + msg310938

stage: patch review -> resolved
2018-01-28 11:31:50ncoghlansetmessages: + msg310937
2018-01-28 10:57:10miss-islingtonsetstage: backport needed -> patch review
pull_requests: + pull_request5221
2018-01-28 10:56:27ncoghlansetstage: patch review -> backport needed
2018-01-28 10:56:09ncoghlansetmessages: + msg310934
2018-01-28 07:35:18CuriousLearnersetpull_requests: + pull_request5217
2018-01-28 07:34:43nitishchsetkeywords: + patch
stage: needs patch -> patch review
pull_requests: + pull_request5216
2018-01-28 05:12:23ncoghlansetmessages: + msg310920
2018-01-27 23:49:50nitishchsetnosy: + nitishch
messages: + msg310899
2018-01-27 13:20:04ncoghlansetnosy: + serhiy.storchaka
messages: + msg310857
2018-01-27 11:20:50CuriousLearnersetmessages: + msg310855
2018-01-27 11:13:27cheryl.sabellasetnosy: + CuriousLearner, cheryl.sabella, ncoghlan

messages: + msg310853
stage: needs patch
2018-01-27 10:31:56storymode7create