[解決!Python]assert文でプログラム実行時に特定の条件が満たされているかどうかを確認するには:解決!Python
Pythonのassert文はプログラムの実行時に、特定の箇所で特定の条件が満たされているかどうかをチェックして、満たされていなければ例外を発生させる。その基本的な使い方を紹介する。
# assert文の基本的な使い方
def myfunc(x):
assert x > 0
return x * 2
print(myfunc(10)) # OK
print(myfunc(-8)) # NG:AssertionError
# 条件が満たされなかったときにメッセージを伝える
def myfunc(x):
assert x > 0, 'x must be a positive number.'
return x * 2
print(myfunc(10)) # OK
print(myfunc(-8)) # NG
assert文
Pythonのassert文を使用すると、プログラムの(デバッグ)実行時に特定の箇所で特定の条件が満たされているかを調べられる。
- 「assert 式1, 式2」のように書く。「式1」には成り立つかどうかを調べたい式を、「式2」には「式1」が成り立たなかったとき(値がFalseだったとき)に表示するメッセージを記述する。式1の値がTrue(条件が満たされた)ときには例外が発生することもなく実行はそのまま続けられ(次のコードに制御が移動し)、式1の値がFalse(条件が満たされない)ときにはAssertionError例外が発生する
- assert文が有効なのはPythonの組み込み定数__debug__がTrueのとき(デフォルト)
- __debug__をFalseにする(assert文を無効化する)にはPythonの起動時にコマンドラインオプションで-Oもしくは-OOを指定する
以下に例を示す。
def myfunc(x):
assert x > 0
return x * 2
print(myfunc(10)) # OK
print(myfunc(-8)) # NG:AssertionError
この例では、myfunc関数では何らかの理由によりパラメーターxの値が正数である必要がある。そのことを「assert x > 0」と記述することで示している。
条件が満たされなかったときに、何らかのメッセージを伝えたいのであれば、2つ目の式を記述する。以下はその例だ。
def myfunc(x):
assert x > 0, 'x must be a positive number.'
return x * 2
print(myfunc(10)) # OK
print(myfunc(-8)) # NG
この例は最初の例に条件が満たされなかったときに表示するメッセージを追加したものだ。こうすると、式1の条件が満たされず、AssertionError例外が発生したときに「x must be a positive number.」というメッセージが表示されるようになる。
以下は上記のコードをsample.pyという名前のファイルに保存して実行してみた結果だ。最後に「AssertionError: x must be a positive number.」と出力されているのが分かる。
assert文はPythonの組み込み定数__debug__の値がTrueのときにのみ有効である。__debug__の値はPython処理系の起動時にコマンドラインオプションとして-Oもしくは-OOが指定されたとき以外はTrueとなる。つまり、多くの場合は__debug__の値はTrueとなっている(__debug__への代入は禁止されている)。
-Oオプションまたは-OOオプションを指定してPython処理系を実行すると、assert文と__debug__の値がTrueのときに実行されるようになっているコードは削除される。Python処理系に-Oオプションを指定して、上記のプログラムを実行した様子を以下に示す。
assert文がなくなったので、負値を与えてmyfunc関数を呼び出した場合でもAssertionError例外が発生することなく、関数が最後まで実行され-8を2倍した値が返されている点に注意しよう。
このことから分かるのは、assert文はプログラムのロジックが正しく動作していることを確認するためのデバッグ支援用の機能であり、この場合は負値を正しく処理するためのコードを記述しないままだとプログラマーの想定とは異なる振る舞いとなる可能性があるということだ。実際には受け取った値のチェックや外部サービスから取得したデータが適切かどうかを判断したり、それに応じて適切な処理を行ったりするには例外などの機構を用いることになるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.