Pythonのassertの使い方
Pythonではassert
文によってデバッグ用のアサーションを設定できる。指定した式が偽のときにAssertionError
が送出され、プログラムが途中で終了する。
assert
文の基本的な使い方
assert
の後ろにチェックしたい式を記述する。
assert 式
式が真の場合は何も起こらないが、偽の場合はAssertionError
が送出されプログラムが途中で終了する。便宜上、サンプルコードではコメントアウトしている。
a = 100
assert a == 100
# assert a == 0
# AssertionError:
if文などにおける条件式と同様に、True
やFalse
以外の値も真・偽として判定される。例えば0
の数値や空のリストなどは偽。
assert [0, 1, 2]
# assert []
# AssertionError:
and
やor
で複数条件を組み合わせたり、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
はあくまでもデバッグ用で、実際の使用時・運用時に条件をチェックしたい場合は例外処理などを用いる。