python / python/cpython

REPLs don't handle `SystemError` from the compiler

オープン
#150,732 コメント 0 件 リアクション 0 件 担当者 1 名 GitHub で見る

@johnslavik がすでに取り組んでいます。

2026年6月1日 から。

3.14 3.15 3.16 stdlib topic-repl type-bug
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

Bug report

Bug description:

During investigating #150700 I found that running the snippet class X: [(lambda: __class__)() for () in ()] causes the following bugs to appear:

  1. The REPL leaks _IncompleteInputError, which aborts writing the user input to history
  2. The user input isn't shown; Traceback is shown immediately after the prompt string >>>
❯ ./python.exe
Python 3.16.0a0 (heads/gh-143535-singledispatchmethod-dispatches-on-first-argument:fad06746051, M) [Clang 17.0.0 (clang-1700.6.3.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> Traceback (most recent call last):r () in ()]
  File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 64, in _maybe_compile
    compiler(source, filename, symbol, flags=flags)
    ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 117, in __call__
    codeob = compile(source, filename, symbol, flags, True)
  File "<stdin>", line 1
    class X: [(lambda: __class__)() for () in ()]
                                                ^
_IncompleteInputError: incomplete input

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/readline.py", line 406, in multiline_input
    return reader.readline()
           ~~~~~~~~~~~~~~~^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 1021, in readline
    self.handle1()
    ~~~~~~~~~~~~^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 1004, in handle1
    self.do_cmd(cmd)
    ~~~~~~~~~~~^^^^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 924, in do_cmd
    command.do()
    ~~~~~~~~~~^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/readline.py", line 297, in do
    r.more_lines is not None and r.more_lines(text)
                                 ~~~~~~~~~~~~^^^^^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/simple_interact.py", line 85, in _more_lines
    code = console.compile(src, "<stdin>", "single")
  File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 154, in __call__
    return _maybe_compile(self.compiler, source, filename, symbol, flags=self.compiler.flags)
  File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 67, in _maybe_compile
    compiler(source + "\n", filename, symbol, flags=flags)
    ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 117, in __call__
    codeob = compile(source, filename, symbol, flags, True)
SystemError: compiler_lookup_arg(name='__class__') with reftype=5 failed in X; freevars of code <lambda>: ('__class__',)

I believe SystemError should be handled.

CPython versions tested on:

3.14, 3.15, 3.16, CPython main branch

Operating systems tested on:

macOS

Linked PRs
  • gh-151480

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。