Pythonのassertの使い方

Modified: | Tags: Python, エラー処理

Pythonではassert文によってデバッグ用のアサーションを設定できる。指定した式が偽のときにAssertionErrorが送出され、プログラムが途中で終了する。

assert文の基本的な使い方

assertの後ろにチェックしたい式を記述する。

assert 

式が真の場合は何も起こらないが、偽の場合はAssertionErrorが送出されプログラムが途中で終了する。便宜上、サンプルコードではコメントアウトしている。

a = 100

assert a == 100

# assert a == 0
# AssertionError: 

if文などにおける条件式と同様に、TrueFalse以外の値も真・偽として判定される。例えば0の数値や空のリストなどは偽。

assert [0, 1, 2]

# assert []
# AssertionError: 

andorで複数条件を組み合わせたり、notで否定を取ったりすることも可能。複数条件の指定についての詳細は後述。

a = 100

assert a > 0 and a % 2 == 0

# assert a < 0 and a % 2 == 0
# AssertionError: 

assert文でエラーメッセージを表示

assertにはカンマ区切りで2つ目の式を指定できる。

assert 式1, 式2

この場合、式2がAssertionErrorの引数に渡される。すなわち、式1が偽のときにAssertionError(式2)が送出される。

式2に文字列を指定することで、式1が偽のときにエラーメッセージを表示できる。

a = 100

# assert a == 0, 'a must be 0.'
# AssertionError: a must be 0.

assert文に複数条件を指定

上述のように、andで複数条件を指定できる。ただし、andは短絡評価(ショートサーキット)されるので、左側が偽の場合は右側が評価されない。

def test1(x):
    print('test1 is called.')
    return x > 0

def test2(x):
    print('test2 is called.')
    return x % 2 == 0

a = -100

# assert test1(a) and test2(a), 'Error Message'
# test1 is called.
# AssertionError: Error Message

assertを繰り返し記述する場合も、先に指定した条件が偽だと、その時点でAssertionErrorが送出され処理が終了する。

# assert test1(a), 'Error Message1'
# assert test2(a), 'Error Message2'
# test1 is called.
# AssertionError: Error Message1

結果に関わらず複数の条件の評価を必ず実行したい場合は、例えば以下のように書く。

# assert (test1(a), test2(a)) == (True, True), 'Error Message'
# test1 is called.
# test2 is called.
# AssertionError: Error Message

assert文は-Oまたは-OOオプションで無効化される

公式ドキュメントにあるように、assert expressionおよびassert expression1, expression2はそれぞれ以下のコードと等価。

if __debug__:
    if not expression: raise AssertionError
if __debug__:
    if not expression1: raise AssertionError(expression2)

__debug__は組み込み定数で、Pythonコマンドの実行時に-Oまたは-OOオプションが付けられているとFalse、そうでなければTrueとなる。

したがって、例えばpython -O xxx.pyのようにPythonを実行した場合は__debug__Falseとなり、assertで指定した式のチェックは行われない。

assertはあくまでもデバッグ用で、実際の使用時・運用時に条件をチェックしたい場合は例外処理などを用いる。

関連カテゴリー

関連記事