friendly tracebackモジュールを使ってみよう
friendly_traceback について
firendly_traceback はPythonのエラーが発生したときのトレースバックをよりわかりやすくしてくれる便利なものです。この拡張モジュールはバックエンドで Rich を使っているため、Pythonコードを記述するためにIDEを使っている場合、表示が乱れる場合があります。
Microsoft Visual Studio は問題なく使用できるようです。
インストール
firendly_traceback のインストールは次のように行います。
code: bash
$ pip install friendly
firendly_tracebackの利用方法
firendly_traceback はいくつかの利用方法があります。
コマンドラインで実行する方法
code: bash
$ python -m friendly myscript.py
firendly console を有効にしたREPLで利用する方法
code: bash
$ python -m friendly
Pythonのオプション -i を与えて上記の2つを同時に有効にする方法
code: bash
$ python -i -m friendly myscript.py
Pythonスクリプトの例外をフックする方法
code: python
import friendly_traceback
friendly_traceback.install()
PythonのREPLからfirendly console を有効にする方法
code: python
>> import friendly_traceback
>> friendly_traceback.start_console()
>>
捕獲した例外で呼び出す方法
code: python
import friendly_traceback
# ...
try:
# 何かの処理
except Exception:
friendly_traceback.explain_traceback()
firendly_traceback はコマンドラインでヘルプメッセージを表示させることができます。
code: bash
$ python -m friendly_traceback -h
firendly_traceback の便利なところ
次のような、明らかなエラーになるスクリプトで説明しましょう。
code: myscript.py
None=1
これを、通常のようにPythonで実行すると、当然エラーになります。
code: bash
$ python myscript.py
File "myscript.py", line 1
None=1
^
SyntaxError: can't assign to keyword
初心者には何が起きているのか理解するのに時間がかかるものですし、Pythonに慣れている人でもエラーは憂鬱なものです。
そうしたときに、friendly_traceback を利用します。
code: bash
$ python -m friendly_traceback myscript.py
こして実行すると次のようにエラー内容をわかりやすくトレースバックしてくれます。
https://gyazo.com/45f586b22e0d5dc21bed8a1950dff7d7
Python のREPL で利用した場合でも、firendly_traceback は便利です。
前述の Noneに誤って代入する例では、通常のPythonのREPL では次のようにそっけないメッセージになります。
code: python
>> None=1
File "<stdin>", line 1
SyntaxError: can't assign to keyword
firendly console を有効にしていると次のように、最後にエラーに原因が追加されます。
code: python
>> import friendly_traceback
>> friendly_traceback.start_console()
>> None=1
Traceback (most recent call last):
File "<friendly-console:1>", line 1
None=1
^
SyntaxError: can't assign to keyword
You cannot assign a value to None.
why()
コマンドラインで実行する場合よりも地味に見えますが、REPLで利用すると why()を呼び出せて、何が原因なのかを知ることができるようになります。
code: python
>> why()
None is a constant in Python; you cannot assign it a value.
explain()
他にも、explain()を呼び出すとより詳細な説明をしてくれます。
code: python
>> explain()
Traceback (most recent call last):
File "<friendly-console:1>", line 1
None=1
^
SyntaxError: can't assign to keyword
You cannot assign a value to None.
A SyntaxError occurs when Python cannot understand your code.
Python could not understand the code in the file
'<friendly-console:1>'
beyond the location indicated by --> and ^.
-->1: None=1
^
None is a constant in Python; you cannot assign it a value.
if文などでコロンを記述もれがあるときも便利です。
code: python
>> if True
File "<stdin>", line 1
if True
^
SyntaxError: invalid syntax
code: python
>> friendly_traceback.start_console()
>> if True
Traceback (most recent call last):
File "<friendly-console:1>", line 1
if True
^
SyntaxError: invalid syntax
Did you forget a colon :?
what()
Python では変数をセットする前に参照するとエラーになります。
code: python
>> freddy = freddy + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'freddy' is not defined
firendly console では、こうしたときにwhat()を使って何が起きたのかが表示されます。
code: python
>> import friendly_traceback
>> friendly_traceback.start_console()
>> freddy = freddy + 1
Traceback (most recent call last):
File "<friendly-console:1>", line 1, in <module>
freddy = freddy + 1
NameError: name 'freddy' is not defined
>> what()
NameError: name 'freddy' is not defined
A NameError exception indicates that a variable or
function name is not known to Python.
Most often, this is because there is a spelling mistake.
However, sometimes it is because the name is used
before being defined or given a value.
where()
上記の場合、1行しか入力していないのでエラーの箇所がはっきりしていますが、スクリプト中で多くのモジュールが関係していると、エラーの箇所が曖昧になりやすいものです。そうしたときは、where()を使うとどこがエラーなのかを明示してくれます。
code: python
>> where()
Exception raised on line 1 of file <friendly-console:1>.
-->1: freddy = freddy + 1
^^^^^^
参考