Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-102778: IDLE - make sys.last_exc available in Shell after traceback #103314

Merged
merged 5 commits into from Apr 19, 2023

Conversation

iritkatriel
Copy link
Member

@iritkatriel iritkatriel commented Apr 6, 2023

@iritkatriel
Copy link
Member Author

Is this documented anywhere in idlelib docs?

@terryjreedy
Copy link
Member

Yes and no. The 'yes' part is that "Running user code" says that IDLE generally tries to run user code so that it gives the same output (objects) one would get if one runs the same code in python itself, in either batch or interactive mode. Some known differences are then listed in this section and the next, "Displaying output in Shell".

For this issue, user-code sys.last_xyz expressions should have the same result as with python.exe in the same circumstances. In user code, sys.last_exc must continue raising an attribute error in 3.11 like it does in REPL. I considered whether to use last_exc 'internally' in 3.11, but decided to leave 3.11 alone. (And you never suggested touching it.)

In 3.12, last_exc must be set after the the first uncaught-by-user-code 'interactive' exception. Since IDLE intends to simulate running code from an editor with python -i, all user exceptions caught by IDLE are treated as interactive. Hence the two new lines in run.py that unconditionally set last_exc along with the deprecated but still supported attributes. For users, these 2 lines are the only new code relevant to 'Support sys.last_exc in IDLE'. They should have been in the last alpha and should be added, I think, now.

The immediate manual test is that IDLE imitate the REPL as below instead of raising AttributeError as it does now.

>>>import sys; 1/0
Traceback ...
>>> sys.last_exc
ZeroDivisionError('division by zero')

Fixing test_run to check this may or may not be simple.

This change should get a line in What's New 3.12. Check the IDLE entry in What's New 3.11. This could be done later.

The no part is that the rest of the patch, including that to pyshell.py, only concerns stackviewer. This is internal code of no direct concern to users. It need not be done now, or even in 3.12, as it should continue to work. When revised, the support for 2.x string exceptions and the use of the old attributes (which were for support of string exceptions) should be removed. The only effect on users would be that the way to disable stackviewer will change from del sys.last_traceback (undocumented except the the error message ;-) to del sys.last_exc. So revert the current stackview changes and draft a separate PR or wait for me to do so in maybe a week.

@terryjreedy
Copy link
Member

terryjreedy commented Apr 7, 2023

Reviewing further, I think that the second sys.last_exc = value may not be needed for the user code issue. The test would be to make only the first addition and manually test. The second may be redundant with the first or it may only be used for internal communication. The exception ultimately comes from sys.exc_info (or from a test) and IDLE does not have to use sys as a cache. It should only set sys.last_xyz as needed for non-IDLE code.

In any case, I would like to be able to pass the exception object to stackviewer and its tree item so that the module has no need of sys. Such a change could be attached to #102832 and backported to 3.11. #68978 has a list of possible improvements for stackviewer and if I get familiar with the code again I might want to do some and backport to 3.11.

Closing was an accident. Time to sleep.

@terryjreedy terryjreedy closed this Apr 7, 2023
@terryjreedy terryjreedy reopened this Apr 7, 2023
@terryjreedy
Copy link
Member

I verified that the setting of sys.last_exc in print_exception should be sufficient.

@iritkatriel iritkatriel changed the title gh-102778: add last_exc in idlelib, to replace sys.last_type/value/traceback gh-102778: add last_exc in idlelib, to eventually replace sys.last_type/value/traceback Apr 7, 2023
@terryjreedy terryjreedy changed the title gh-102778: add last_exc in idlelib, to eventually replace sys.last_type/value/traceback gh-102778: IDLE - make sys.last_exc available in Shell after traceback Apr 19, 2023
@terryjreedy terryjreedy merged commit d1e4917 into python:main Apr 19, 2023
17 checks passed
carljm added a commit to carljm/cpython that referenced this pull request Apr 20, 2023
* main: (24 commits)
  pythongh-98040: Move the Single-Phase Init Tests Out of test_imp (pythongh-102561)
  pythongh-83861: Fix datetime.astimezone() method (pythonGH-101545)
  pythongh-102856: Clean some of the PEP 701 tokenizer implementation (python#103634)
  pythongh-102856: Skip test_mismatched_parens in WASI builds (python#103633)
  pythongh-102856: Initial implementation of PEP 701 (python#102855)
  pythongh-103583: Add ref. dependency between multibytecodec modules (python#103589)
  pythongh-83004: Harden msvcrt further (python#103420)
  pythonGH-88342: clarify that `asyncio.as_completed` accepts generators yielding tasks (python#103626)
  pythongh-102778: IDLE - make sys.last_exc available in Shell after traceback (python#103314)
  pythongh-103582: Remove last references to `argparse.REMAINDER` from docs (python#103586)
  pythongh-103583: Always pass multibyte codec structs as const (python#103588)
  pythongh-103617: Fix compiler warning in _iomodule.c (python#103618)
  pythongh-103596: [Enum] do not shadow mixed-in methods/attributes (pythonGH-103600)
  pythonGH-100530: Change the error message for non-class class patterns (pythonGH-103576)
  pythongh-95299: Remove lingering setuptools reference in installer scripts (pythonGH-103613)
  [Doc] Fix a typo in optparse.rst (python#103504)
  pythongh-101100: Fix broken reference `__format__` in `string.rst` (python#103531)
  pythongh-95299: Stop installing setuptools as a part of ensurepip and venv (python#101039)
  pythonGH-103484: Docs: add linkcheck allowed redirects entries for most cases (python#103569)
  pythongh-67230: update whatsnew note for csv changes (python#103598)
  ...
@iritkatriel iritkatriel deleted the exc_info-idlelib branch July 25, 2023 18:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add sys.last_exc, deprecate sys.last_type, sys.last_value and sys.last_traceback
3 participants