Repository navigation
New REPL exits when there are non-string candidates for suggestions #130999
Copy link
Copy link
Closed
Labels
3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-replRelated to the interactive shellRelated to the interactive shelltype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Crash report
What happened?
The new REPL in main will exit if a suggestion would be offered, but there are non-string candidates like below:
>>> import runpy
... runpy._run_module_code("blech", {0: "", "bluch": ""}, "")
...
Exception ignored in the internal traceback machinery:
Traceback (most recent call last):
File "/home/danzin/projects/cpython/Lib/traceback.py", line 139, in _print_exception_bltin
return print_exception(exc, limit=BUILTIN_EXCEPTION_LIMIT, file=file, colorize=colorize)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 129, in print_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1138, in __init__
context = TracebackException(
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1094, in __init__
suggestion = _compute_suggestion_error(exc_value, exc_traceback, wrong_name)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1535, in _compute_suggestion_error
return _suggestions._generate_suggestions(d, wrong_name)
TypeError: all elements in 'candidates' must be strings
Traceback (most recent call last):
File "<python-input-0>", line 2, in <module>
File "/home/danzin/projects/cpython/Lib/runpy.py", line 98, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "/home/danzin/projects/cpython/Lib/runpy.py", line 88, in _run_code
exec(code, run_globals)
File "<string>", line 1, in <module>
NameError: name 'blech' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/danzin/projects/cpython/Lib/_pyrepl/console.py", line 173, in _excepthook
lines = traceback.format_exception(
File "/home/danzin/projects/cpython/Lib/traceback.py", line 154, in format_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1094, in __init__
suggestion = _compute_suggestion_error(exc_value, exc_traceback, wrong_name)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1535, in _compute_suggestion_error
return _suggestions._generate_suggestions(d, wrong_name)
TypeError: all elements in 'candidates' must be strings
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/danzin/projects/cpython/Lib/runpy.py", line 198, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/home/danzin/projects/cpython/Lib/runpy.py", line 88, in _run_code
exec(code, run_globals)
File "/home/danzin/projects/cpython/Lib/_pyrepl/__main__.py", line 6, in <module>
__pyrepl_interactive_console()
File "/home/danzin/projects/cpython/Lib/_pyrepl/main.py", line 59, in interactive_console
run_multiline_interactive_console(console)
File "/home/danzin/projects/cpython/Lib/_pyrepl/simple_interact.py", line 152, in run_multiline_interactive_console
more = console.push(_strip_final_indent(statement), filename=input_name, _symbol="single") # type: ignore[call-arg]
File "/home/danzin/projects/cpython/Lib/code.py", line 324, in push
more = self.runsource(source, filename, symbol=_symbol)
File "/home/danzin/projects/cpython/Lib/_pyrepl/console.py", line 231, in runsource
result = self.runcode(code)
File "/home/danzin/projects/cpython/Lib/_pyrepl/console.py", line 191, in runcode
self.showtraceback()
File "/home/danzin/projects/cpython/Lib/code.py", line 128, in showtraceback
self._showtraceback(typ, value, tb.tb_next, "")
File "/home/danzin/projects/cpython/Lib/code.py", line 144, in _showtraceback
self._excepthook(typ, value, tb)
File "/home/danzin/projects/cpython/Lib/_pyrepl/console.py", line 179, in _excepthook
lines = traceback.format_exception(
File "/home/danzin/projects/cpython/Lib/traceback.py", line 154, in format_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1138, in __init__
context = TracebackException(
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1094, in __init__
suggestion = _compute_suggestion_error(exc_value, exc_traceback, wrong_name)
File "/home/danzin/projects/cpython/Lib/traceback.py", line 1535, in _compute_suggestion_error
return _suggestions._generate_suggestions(d, wrong_name)
TypeError: all elements in 'candidates' must be stringsThis is an offshoot of #129573, where code like above would abort in 3.12.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Output from running 'python -VV' on the command line:
Python 3.14.0a5+ (heads/main:a3990df6121, Mar 9 2025, 00:02:58) [GCC 13.3.0]
Linked PRs
- gh-130999: Avoid exiting the new REPL when there are non-string candidates for suggestions #131001
- [3.14] gh-130999: Avoid exiting the new REPL when there are non-string candidates for suggestions (gh-131001) #135019
- [3.13] gh-130999: Avoid exiting the new REPL when there are non-string candidates for suggestions (gh-131001) #135020
- gh-130999: Fix globals() poisoning in test_traceback #135030
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-replRelated to the interactive shellRelated to the interactive shelltype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Activity
picnixz commentedon Mar 9, 2025
Ok, I'll say it's a bug for 3.13/3.14 and a crash for 3.12 but the crash issue is tracked elsewhere
terryjreedy commentedon May 9, 2025
In dup #133748, the code was
globals().update({123: 'test'}); not_defined. However,globals()[123] = 'a'; xxxalso works. Both of these (on Windows) have just one "During handling ..." section. If REPL is started from an icon, it 'crashes' in that the window closes when the REPL quits due to its internal error (instead of printing the traceback and then a new '>>>' prompt).On the other issue, @StanFromIreland proposed, as I understand it, that globals be made a string-only dict. Since, AFAIK, it is not documented as such, I suspect that this would break something. As I remember, @gvanrossum once rejected the idea of making class
.__dict__string only, so that setting non-string attributes (with setattr, for instance), would raise. I think the same may be true for globals dict.With a non-string in globals,
dir()exits with "TypeError: '<' not supported between instances of 'int' and 'str'". This says a) non-strings in globals are not ordinarily a good idea, but b) the possibility has be anticipated and gracefully handled. The simplest solution here is for the hinter to ignore non-strings as possible name corrections, as they definitely are not, instead of crashing the REPL.6 remaining items
encukou commentedon Jun 2, 2025
I think the fix here is what's causing the buildbot failure seen at: https://buildbot.python.org/#/builders/1368/builds/3297:
ambv commentedon Jun 2, 2025
I'm on it.
pythongh-130999: Fix globals() poisoning in test_traceback
pythongh-130999: Fix globals() poisoning in test_traceback
pythongh-130999: Fix globals() poisoning in test_traceback
gh-130999: Fix globals() poisoning in test_traceback (gh-135030)
[3.14] gh-130999: Avoid exiting the new REPL when there are non-strin…
[3.13] gh-130999: Avoid exiting the new REPL when there are non-strin…
pythongh-130999: Avoid exiting the new REPL when there are non-string…
pythongh-130999: Fix globals() poisoning in test_traceback (pythongh-…
pythongh-130999: Avoid exiting the new REPL when there are non-string…
pythongh-130999: Fix globals() poisoning in test_traceback (pythongh-…
pythongh-130999: Avoid exiting the new REPL when there are non-string…
pythongh-130999: Fix globals() poisoning in test_traceback (pythongh-…