Python assert() 関数

株式会社リュディアです。今回は assert () 関数についてまとめてみたいと思います。

assert() 関数を使っておられる方は少ないのではないでしょうか?名前を聞いたことも無いと言う方もおられると思います。私は実際のプログラミングではかなりの量の assert() を使っています。非常に役に立つので今回は使い方も含めてまとめてみたいと思います。

Assertion 機能を提供する関数が assert() です。いろいろな表現があるかと思いますが、私の理解は当然成り立つ結果を記載し本当に成り立っているものなのかをプログラム内でセルフチェックするための機能が Assertion です。早速例を見てみましょう。

a = 2
b = 2
c = 3
assert(a == b)
assert(a == c)

# ---------------------------------------------------------------------------
# AssertionError                            Traceback (most recent call last)
# <ipython-input-2-b152ae7dd4ab> in <module>
#       3 c = 3
#       4 assert(a == b)
# ----> 5 assert(a == c)
# 
# AssertionError: 

a, b, c という 3 つの変数を用意し、それぞれ 2, 2, 3 を初期値とします。2つの assert() 関数の中で a == b と a == c を確認します。a == b は成立するので問題なし、a == c は成立しないので問題が発生します。

実際、AssertionError が発生しています。この例は AssertionError の発生例を示したかったので何のために assert() を使っているのかわかりにくいですね。では次の例をみてください。

max_value_1 = 10
max_value_2 = 11

sum = 0
for iter in range(max_value_1):
   assert(0 <= iter and iter < max_value_1)
   sum += iter
print(sum)

# 45

このプログラムを書いているときに max_value_1 と 2 を記述し間違った場合はどうなるでしょうか?

max_value_1 = 10
max_value_2 = 11

sum = 0
for iter in range(max_value_2):
   assert(0 <= iter and iter < max_value_1)
   sum += iter
print(sum)

# ---------------------------------------------------------------------------
# AssertionError                            Traceback (most recent call last)
# <ipython-input-5-1b8bb514b661> in <module>
#       4 sum = 0
#       5 for iter in range(max_value_2):
# ----> 6     assert(0 <= iter and iter < max_value_1)
#       7     sum += iter
#       8 print(sum)
# 
# AssertionError:

max_value_1 と 2 では数値が 1 異なるだけなので多くの場合プログラムがうまく動いてしまい気づきにくい可能性があります。そこであたりまえのことだけど自分のコーディングミスが発見されたらラッキーと思いながら assert(0 <= iter and iter < max_value_1) をいれておくことで検出できたわけです。

最終リリース版で Assertion を実行していると実行時間に影響を与えるので、-O オプションをつけることで assert() 関数を無効化します。

Python -O program.py

-O を付けることで内部変数の __debug__ = False になり assert() が無効になります。プログラム中で __debug__ == False というように書き換えはできませんのでご注意ください。

最後に assert() を使う上で注意すべきことを記載しておきます。

1. assert() が無効になったときにプログラムの動作に影響を与えないようにする
2. エラー処理の代替として assert() を使わない

1 はわかると思いますが、特に 2については注意が必要です。エラー処理はプログラムの一部として実装すべきものです。私の感覚では自分の頭の中にあるイメージとプログラムの動作が一致しているかどうかを確認するのが assert() であってエラー処理や例外処理とは異なるものと理解しています。

assert() 関数は注意深く使うと強力な開発ツールになりえます。無理には使わなくてよいですが、少しずつ使ってみてください。

では、ごきげんよう。


いいなと思ったら応援しよう!