検索
連載

[解決!Python]assert文でプログラム実行時に特定の条件が満たされているかどうかを確認するには解決!Python

Pythonのassert文はプログラムの実行時に、特定の箇所で特定の条件が満たされているかどうかをチェックして、満たされていなければ例外を発生させる。その基本的な使い方を紹介する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「解決!Python」のインデックス

連載目次

# 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.」と出力されているのが分かる。

AssertionError例外に追加でメッセージが表示されたところ
AssertionError例外に追加でメッセージが表示されたところ

 assert文はPythonの組み込み定数__debug__の値がTrueのときにのみ有効である。__debug__の値はPython処理系の起動時にコマンドラインオプションとして-Oもしくは-OOが指定されたとき以外はTrueとなる。つまり、多くの場合は__debug__の値はTrueとなっている(__debug__への代入は禁止されている)。

 -Oオプションまたは-OOオプションを指定してPython処理系を実行すると、assert文と__debug__の値がTrueのときに実行されるようになっているコードは削除される。Python処理系に-Oオプションを指定して、上記のプログラムを実行した様子を以下に示す。

負値を与えたmyfunc関数呼び出しも実行されている
負値を与えたmyfunc関数呼び出しも実行されている

 assert文がなくなったので、負値を与えてmyfunc関数を呼び出した場合でもAssertionError例外が発生することなく、関数が最後まで実行され-8を2倍した値が返されている点に注意しよう。

 このことから分かるのは、assert文はプログラムのロジックが正しく動作していることを確認するためのデバッグ支援用の機能であり、この場合は負値を正しく処理するためのコードを記述しないままだとプログラマーの想定とは異なる振る舞いとなる可能性があるということだ。実際には受け取った値のチェックや外部サービスから取得したデータが適切かどうかを判断したり、それに応じて適切な処理を行ったりするには例外などの機構を用いることになるだろう。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る