Python では compile() 文字列を exec() でより高速に実行できます。しかし、使用するとすぐに、exec で例外が発生したときに情報が失われました。
たとえば、不明なメソッドを呼び出すコード スニペットを次に示します (デモ用)。
code = 'my_unknown_method()'
bytecode = compile(code, '<string>', 'exec')
その後、そのバイトコードで exec を呼び出しています。
exec bytecode
表示されたトレースバックは次のとおりです。
Traceback (most recent call last):
File "test.py", line 3, in <module>
exec bytecode
File "<string>", line 1, in <module>
NameError: name 'my_unknown_method' is not defined
「exec()」フレームがわかりにくくなりました。次のようなより良い例外が必要です。
Traceback (most recent call last):
File "test.py", line 3, in <module>
exec "my_unknown_method()"
File "<string>", line 1, in <module>
NameError: name 'my_unknown_method' is not defined
何かご意見は ?
ノート:
- compile の 2 番目の引数 (ファイル名) を使用したくない
- フレームの f_code を調べて変更することをテストしましたが、読み取り専用属性です。
編集: sys.excepthook をさらに調べた後、python ソース コード/traceback.c で、python が行の内容を表示したい場合、ファイルが見つかった場合は直接 fopen() であることがわかりました。独自のコンテンツを表示するためのフックはまったくありません。唯一の方法は、ディスク上に実際の偽のファイル名を作成することですか? 誰 ?
EDIT2: いくつかの jinja2 デバッグ コードをチェックしましたが、トレースバックも書き直していますが、内容は書き直していません。カスタム以外のフックが必要ですか? それに関する私の懸念は、それがトレースバック自体にないためです。ユーザー/モジュール/何かが例外を受け取った場合、トレースバックには貴重な情報が含まれません。