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