Python インタープリターがエラー/例外を報告すると (これからは、これらの両方を指すために「エラー」とだけ言います)、行番号とエラーの原因となった行の内容を出力します。
興味深いことに、エラーを引き起こし、スクリプトの実行中にファイルを変更する実行時間の長い Python スクリプトがある.py
場合、インタープリターは、変更されたファイルの内容に基づいて、エラーを発生させたとして誤った行を報告でき.py
ます。
MWE:
サンプル.py
from time import sleep
for i in range(10):
print(i)
sleep(1)
raise Exception("foo", "bar")
このスクリプトは 10 秒間実行され、その後例外が発生します。
sample2.py
from time import sleep
for i in range(10):
print(i)
sleep(1)
"""
This
is
just
some
filler
to
demonstrate
the
behavior
"""
raise Exception("foo", "bar")
このファイルはsample.py
、ループの終わりと行の間にジャンクがあり、次の例外が発生することを除いて、 と同じです。
Traceback (most recent call last):
File "sample.py", line 7, in <module>
Exception: ('foo', 'bar')
私がしたこと
python3 sample.py
- 2 番目のターミナル ウィンドウで、実行が終了
mv sample.py sample.py.bak && cp sample2.py sample.py
する前にsample.py
予想される行動
インタープリターは次のように報告します。
Traceback (most recent call last):
File "sample.py", line 7, in <module>
Exception: ('foo', 'bar')
ここで、インタープリターは の 7 行目に例外があったことを報告し、例外sample.py
を出力します。
実際の動作
インタープリターは次のように報告します。
Traceback (most recent call last):
File "sample.py", line 7, in <module>
"""
Exception: ('foo', 'bar')
ここで、インタープリター"""
は例外を報告するときにも報告します。この情報を見つけるために、プログラムを実行するためにメモリにロードされたファイルではなく、ディスク上のファイルを調べているようです。
私の混乱の原因
以下は、実行時に何が起こるかについての私のメンタル モデルですpython3 sample.py
。
- インタプリタは の内容
sample.py
をメモリにロードします - インタプリタは字句解析、意味解析、コード生成などを実行してマシンコードを生成します
- 生成されたコードはCPUに送られ実行されます
- エラーが発生した場合、インタープリターはソース コードのメモリ内表現を参照してエラー メッセージを生成します。
明らかに、私のメンタル モデルには欠陥があります。
私が知りたいこと:
- Python インタープリターがメモリ内ではなく、ディスク上のファイルを参照してエラー メッセージを生成するのはなぜですか?
- 通訳者が何をしているのかについての私の理解に、他に何か欠陥がありますか?