一般的な質問で申し訳ありません。私が欲しいものの詳細:
ユーザーが Python コードを記述して実行できるようにしたいと考えています。処理されない例外が発生したら、デバッガーで実行を一時停止し、現在の状態/環境/スタック/例外に関する情報を表示して、コードを編集できるようにします。
例外が発生した場所で特別なコード ブロックを編集可能にしたいだけで、他には何もありません (今のところ)。つまり、ループ内で発生した場合は、ループfor
内のコード ブロックのみをfor
編集可能にしたいのです。これは、ユーザー エディター スコープ内にある最新/最新のコード ブロックである必要があります (他のライブラリや Python ライブラリ内ではありません)。この条件下では、どのコード ブロックを編集するかは常に明確です。
少し迷っていますが、これを行う方法を少し調査しようとしました。
Python のトレースバックは、コード ブロックを直接提供するのではなく、関数とコード行だけを提供します。私はそれを逆算することができましたが、それは私には少しハックなようです. コードの AST でコード ブロックへの参照を何らかの方法で取得できれば、より良い (そしてより自然な) ものになります。
AST を取得する (そしてそれを操作する、つまり操作/編集する) には、おそらくcompiler
(どちらが非推奨ですか?) および/またはparser
モジュールを使用します。またはast
モジュール。ASTで特別なノード/コードブロックを再コンパイルする方法がわかりません。または、関数全体を再コンパイルすることしかできない場合。