Pythonのassert(アサーション)の使い方や実装方法を解説していく

スポンサーリンク

Pythonでよく使われるアサーションと呼ばれるテストやデバッグの手法について学びましょう。

アサーションとは何か、なぜ使われるのか、いつ使ってはいけないのか、そしてその構文について学びます。

それでは、はじめましょう。

スポンサーリンク

Pythonのアサーションとは?

Pythonのアサーションは、プログラム上で条件を主張するための文です。

アサーションは、アサーションされた条件が偽であることが判明した場合、プログラムが続行されないように設計されています。

もしアサーションされた条件が偽であれば、ステートメントは AssertionError を発生させます。

AssertionError` の例外と一緒にメッセージを送信するオプションもあります。

なぜアサーションが使われるのか?

アサーションステートメントは、プログラマが開発サイクル中にコードをテストおよびデバッグし、コードに存在する可能性があるバグをプログラマに通知するために使用されます。

アサーション文はコードのテストやデバッグの一部であるため、これらの文は開発者だけのためのものです。

そこで、プログラムの後半で論理エラーや例外を回避できるように、ブロックの実行前または実行後に特定の条件が満たされていることを確認するために、アサーションを使用するのです。

assert文の意図する使い方は、文中に書いた条件が決して偽にならないようにすることです。

もし、その条件が偽であることが判明した場合、それはプログラムのバグであり、取り除かなければならないことになっています。

アサーションの良い例としては、ある数の反対数を計算する関数が常に正の結果を与えることを保証し、それ以外の場合は、入力やその他の外部要因ではなく、関数の論理に誤りがあることを保証することができます

アサーションはいつ使うべきか?

アサーションは、実行時のエラーを処理するためのものではありません。

File not found”, “Insufficient memory/heap”, “Connection not established” などのエラーは、 else節かexcept節で処理し、修正することができます

これらの文はバグではなく、何らかの外的要因が満たされていないために存在しているだけで、プログラム単体では問題ないでしょう。

アサーションはデバッグ用の命令なので、プログラムを最適化モードで実行すると、プログラムの実行中はすべてのアサーションが無視される。

プログラムを最適化モードで実行するには、次のように-Oフラグを使用します。

python -O file_name.py

これにより、コードのデバッグが無効になり、すべてのアサーション文が無視されます。

そのため、もしアサーションが入力やセキュリティ問題を検証するために使用されている場合、その検証は最適化モードではもはや存在せず、不要なエラーやセキュリティの抜け穴を引き起こす可能性があります。

たとえば、アサーションを使ってユーザーが管理者であることを表明し、 管理者権限を与えた場合、最適化モードでコードを実行すると、 アサーションが無視され、すべてのユーザーに管理者権限が与えられることになります。

同様に、もしアサーションを使ってユーザーの年齢が18歳以上であることを確認した場合、コードを最適化モードで実行すれば、どのユーザーもアサーションを回避することができます

つまり、ある条件がプログラム自体のバグの結果である場合、つまり入力や外部条件ではなくコードに何か問題がある場合、アサーションを使って条件を主張し、バグの存在を立証することができる、ということです。

Pythonでアサーションを実装する

Pythonでアサーションを記述する方法を理解するために、いくつかの例を挙げてみましょう。

コードサンプルは非常に基本的な例であり、構文と文の動作を説明する目的しかないことに注意してください。

a = 12
b = int(input())
assert b != 0
print(a / b)

上のコードでは、次の文に行く前に b が 0 であってはいけないという条件をアサーションしています。

出力に行く前に、構文を見てみましょう。

assert というキーワードの後には、必ず True か False になる式を記述しなければなりません。

また、メッセージを追加するオプションもありますが、それは後で見ることにします。

上の例では、入力が 0 以外であれば、式の結果は True となり、出力は次のようになります。

a = 12
b = int(input())
assert b != 0, "The input cannot be zero!"
print(a / b)

ここでは、入力として 5 を与えましたが、コードは問題なく実行されました。

では、入力として 0 を与えるとどうなるか見てみましょう。

Assertion Passed Example
Assertion example when condition is satisfied

bの値が0の場合、条件はFalseを返し、この文はAssertionError` を発生させます。

これは他の例外と同じで、try-except-clause で処理することができます

しかし、そうするとアサーションの目的が達成されません。

なぜなら、アサーションはプログラムのバグの可能性をプログラマに通知するためのものだからです。

アサーションにメッセージを追加してみましょう。

Assertion Failed Example
Assertion example when condition is not satisfied

ここで再び、b0 であってはならない、という条件をアサーションしています。

この条件が偽であれば、アサーションはメッセージとともに AssertionError を出します。

そこで、例外とともにメッセージを与えるには、条件を書いた後に、条件とメッセージをカンマで区切って、メッセージを含む文字列を指定する必要があります。

入力が0以外の場合は、出力に変化はないが、入力が 0 の場合は、次のように出力される。

Assertion Message Fail Example
Assertion fail with a message

例外の後には、指定したエラーメッセージが続くことに注意してください。

複数のアサーションがある場合、どのアサーションが失敗したのかを理解するために、 Assert 文には常にメッセージを表示するようにしましょう。

まとめ

この記事では、assert 文とは何かを学び、どのような場合に使用し、どのような場合に使用してはいけないかを説明しました。

そして、それらが Python でどのように書かれ、コードのデバッグにどのように役立つかについて見てきました。

何か学んでいただけたでしょうか。

また別のチュートリアルでお会いしましょう。

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