Categories: Python

【Python】デバッグに使われるassert文の使い方

この記事では、Pythonのassert文を使ってデバッグする方法を解説します。

assert文は、条件式がFalseの場合に例外を投げます。なので、想定外のことが起こった場合に即座に例外を送出させることができます。

では、assert文の使い方を詳しく見ていきましょう!

assert文の使い方

assert文は、assertキーワードと条件式を組み合わせて使います。指定した条件式がFalseの場合にAssertionErrorが送出され、プログラムが終了します。

assert 条件式

エラーメッセージを指定することでAssertionErrorが送出された際のエラーメッセージを指定できます。

assert 条件式, エラーメッセージ

条件式がTrueだった場合は特に何もしません。

サンプル

以下のコードでは、受け取った値の型を調べてint型以外ならエラーを発生させます。

main.py

num = '1'

assert isinstance(num, int), 'int型ではありません'

実行結果

Traceback (most recent call last):
  File "main.py", line 3, in 
    assert isinstance(num, int), 'int型ではありません'
AssertionError: int型ではありません

try文と組み合わせる

try文と組み合わせることで例外処理することができます。 自らif文を書かなくてもいいのでraiseよりもassert文の方が簡潔に記述できます。

その代わり送出できる例外はAssertionErrorだけですが...。

try:
    num = '1'
    assert isinstance(num, int), 'int型ではありません'
except AssertionError as e:
    print(f'エラー発生: {e}')

実行結果

エラー発生: int型ではありません

tryを使ったエラー処理(例外処理)

assert文を無視する

assert文は、組み込み定数__debug__Trueの時に実行されるようになっており、以下のようなコードと等価です。

# エラーメッセージを指定しない場合
if __debug__:
    if not 条件式: raise AssertionError

# エラーメッセージを指定する場合
if __debug__:
    if not 条件式: raise AssertionError(エラーメッセージ)

つまりは__debug__Falseにすることでソースコード内に定義されている全てのassert文を無視することができます。

__debug__Falseにするには、Pythonコマンドでコードを実行する際に、コマンドラインオプション-O、または-OOを付けて実行します。

main.py

print('start')

assert False, '処理されれば確実にエラーを発生させる'

print('end')

コマンドラインから実行

$ python -O main.py
start
end

これで定義しているすべてのassert文を無視することができます。

ちなみに、__debug__は再代入することができません。代入しようとするとSyntaxErrorが発生するので注意してください。

__debug__ = False

実行結果

  File "/Users/user/Desktop/Python/test.py", line 1
    __debug__ = False
    ^
SyntaxError: cannot assign to __debug__

まとめ

この記事では、Pythonのassert文の使い方を解説しました。

assert文を使うことで簡単にデバッグを行うことができました。定義したassert文は実行時にすべて無視することができるので楽チンですね。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

7か月 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

7か月 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

7か月 ago

【Unity】割合から数値に数値から割合に変換する

この記事では、割合から数値に変換する関数…

7か月 ago

【Python】抽象クラスを定義する方法

この記事では、Pythonで抽象クラスを…

7か月 ago