【Python】デバッグツール assert文の使い方

Python

はじめに

しげっち
しげっち

Pythonのデバッグツールであるassert文について解説するよ!

にゃーすけ
にゃーすけ

デバッグで使用する文なんだにゃあ。

assert文とは

assert文は引数に条件を指定し、その条件の結果がFalseだった場合にAssertionErrorを発生させます。

assert 式

assert文の使用方法

単純な例

x = 1
assert x == 2

上記を実行すると2行目で条件式がFALSEとなりAssertionErrorが発生します。
処理がストップするのでこれ以降のプログラムは実行されなくなります。


# 在庫数計算
def stack_calc(stock, sales):
    return stock - sales

# ケーキの在庫は4つ
cakes_stock = 4
# ケーキの販売数5つ
cakes_sales = 5

#在庫がマイナスになるのはあり得ないのでエラーとする
assert stack_calc(cakes_stock, cakes_sales) >= 0

assertの引数に直接関数を記載できます。

にゃーすけ
にゃーすけ

assert文は条件がFALSEの場合にエラーの処理になるにゃ。if文の条件記載と同じような感覚で書くと、TRUEでエラーになると勘違いしてしまいそうになるから気をつけないといけないにゃあ。

エラー時に任意のメッセージを表示させる例

AsserttionError発生時に任意のメッセージを表示されることもできます。
メッセージを表示される目的はバグの特定をしやすくすることです。

assert 式, メッセージ


# 在庫数計算
def stack_calc(stock, sales):
    return stock - sales

# ケーキの在庫は4つ
cakes_stock = 4
# ケーキの販売数5つ
cakes_sales = 5
# ケーキの在庫計算
assert stack_calc(cakes_stock, cakes_sales) >= 0, 'ケーキの在庫がマイナス'

上記例では、メッセージを指定することで何の在庫がエラーになったか特定できます。

assert文の注意点

assert文の使用にはいくつかの注意点があります。

assert文はあくまでデバッグツール

assert文はデバッグモードの場合のみ動作する文です。

pythonにおいて、デバッグモードは__debug__変数がTRUEの状態となります。
プログラムの実行時、引数に-0を指定すると__debug__変数がFALSEとなり、assert文が実行されなくなります。
このことから、assert文の使用目的は本番環境でのエラーチェックではなく、テスト環境でのエラー検出とエラー原因の早期特定を目的としたものです。

にゃーすけ
にゃーすけ

本番環境で起こり得るエラーはif文で対処するべきということだにゃあ。

assert文を関数として使用すると想定した動作にならない

assert文は関数ではなく文です。if文やfor文、while文と同じ扱いになります。

これを関数のように丸括弧をつけてassert(条件,メッセージ)のように使用すると、
条件の結果はFALSEであっても丸括弧の影響でassertの判定はTRUEとみなされます。
先ほどの在庫計算の処理例を見てみましょう。

# 在庫数計算
def stack_calc(stock, sales):
    return stock - sales

# ケーキの在庫は4つ
cakes_stock = 4
# ケーキの販売数5つ
cakes_sales = 5
# ケーキの在庫計算
assert(stack_calc(cakes_stock, cakes_sales) >= 0, 'ケーキの在庫がマイナス')

上記ではassertを関数のように使用してしまい、引数を丸括弧で括ってしまっています。
これだと本来であれば、AssertionErrorとなるところが正常(TRUE)とみなされてしまいます。

これは、丸括弧をつけることでassert文から見るとtupleの扱いに見えるからです。

print(type((stack_calc(cakes_stock, cakes_sales) >= 0, 'ケーキの在庫がマイナス')))
# 実行結果
# <class 'tuple'>

print((stack_calc(cakes_stock, cakes_sales) >= 0, 'ケーキの在庫がマイナス'))
# 実行結果
# (False, 'ケーキの在庫がマイナス')

上記の実行結果から、FALSE文字列である2つの値を持つtupleである事がわかります。

assert文のまとめ

  • assertに続いて記載した条件式の結果がFALSEの場合にAssertionErrorを発生させる事ができる。
  • AssertionError時のメッセージを指定できる。
  • __debug__=FALSEだとassertは動作しないため、テスト環境でのバグ特定が目的。
  • 関数ではなく文なので、誤って丸括弧をつけてしまうとtuple型になり、想定した動作にならない。
しげっち
しげっち

最後まで読んでいただき、ありがとうございます。

タイトルとURLをコピーしました