
あなたはプログラマーですか? その場合、コーディングに使用している言語に関係なく、デバッグは不可欠なスキルです。この記事では、効果的なデバッグのために Python で assert ステートメントを使用する方法を学習します。
プロジェクトに取り組んでいるときは、複数のモジュールを定義します。 これには、関数、クラス定義などが含まれます。 また、実装のバグが原因で、エラーや予期しない結果が発生する可能性があります。 assert ステートメントは、このようなコードのデバッグに役立ちます。
このチュートリアルでは、 assert ステートメントを使用する構文と、それに続くコード例を使用して動作を確認します。 また、アサーション エラーとは何か、開発中にコード内のエラーを修正するためにアサーション エラーを使用する方法についても説明します。
さぁ、始めよう!
Python で Assert ステートメントを使用する方法
assert ステートメントを使用する構文を学習してから、いくつかの例のコーディングに進みます。
Assert ステートメントの構文
Python で assert ステートメントを使用する構文から始めましょう。
assert expression, message
ここ、
- expression は、評価される任意の有効な Python 式です。 これは、変数の値、変数の真値、関数からの戻り値などの条件にすることができます。
- 式が True と評価される限り、assert ステートメントはエラーをスローしたり、何も返したりしません。 これは、プログラムが期待どおりに動作することを示しています。
- 式が True でなくなると、AssertionError 例外が発生します。
- message はオプションの文字列です。 AssertionError 例外が発生するたびにトレース バックに表示されるメッセージを指定できます。
次に、assert ステートメントがよりクリーンでバグのないコードを作成するのに役立ついくつかの例のコーディングに進みましょう。
このチュートリアルで使用されているコード例は、この GitHub gist にあります。
Python の Assert ステートメントの例
次の例を考えてみましょう。 コードに割引変数があるとします。 ただし、その値を常に max_discount 以下にする必要があります。
誤って割引変数に値を設定していないことを確認するには、アサーションを追加します。 評価する式は、割引 <= max_discount です。
>>> max_discount = 50 >>> discount = 20 >>> assert discount <= max_discount
ここで、割引 (20) は max_discount (50) 未満です。 したがって、assert ステートメントはエラーをスローしません。
AssertionError 例外
割引変数が max_discount より大きい値に設定されている場合、AssertionError 例外が発生します。
>>> discount = 75 >>> assert discount <= max_discount Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
assert ステートメントを使用すると、オプションのメッセージ文字列を指定することもできます。
よりわかりやすい診断情報を提供するメッセージ文字列も使用してみましょう。 assert ステートメントに、discount と max_discount の値も含む Python f-string を追加しましょう。
>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}" Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError: discount should be at most 50; got discount = 75
上記の出力セルに見られるように、AssertionError 例外には現在、discount および max_discount 変数の値が含まれています。
Assert を使用した Python 関数のデバッグとテスト
関数を定義するときに、関数が意図したとおりに機能しない原因となるバグ (論理エラー) を誤って導入することがあります。
例を見てみましょう。 あるクラスでテストがあり、学生にボーナス問題に挑戦する機会が与えられたとします。 ボーナス問題に挑戦した生徒は、テストで追加の 10 点を獲得します。 😄
次の関数 get_final_score を検討してください。
- 現在のスコア、スコア、およびブール値のボーナスを受け取ります。
- 学生がボーナスの質問に答えた場合、ブール値のボーナスは True になり、現在のスコアよりも 10 ポイント多くなります。
- 次に、関数は最終スコアを返します。
def get_final_score(score,bonus): if bonus: score += 10 return score
関数をいくつか呼び出してみましょう。 ボーナスが True と False に設定された 34 と 40 のスコアの場合、最終的なスコアはそれぞれ 44 と 40 であることがわかります。
print(get_final_score(34,True)) # 44 print(get_final_score(40,False)) # 40
ただし、テストの最大点は、たとえば 50 点です。したがって、学生が 49 点を獲得し、ボーナスの質問にも回答した場合、関数 get_final_score は最終的な点数を喜んで 59 と計算します。
print(get_final_score(49,True)) # 59
技術的には可能です。 しかし、学生がテストで可能な最大点を超えることはできないと仮定しましょう。 🙂
max_score 変数を初期化しましょう。 そして、関数から返されたスコアを final_score 変数に取り込みます。
続いて、final_score が max_score より小さいかどうかをチェックするアサーションを追加します。
def get_final_score(score,bonus): if bonus: score += 10 return score final_score = get_final_score(47,True) max_score = 50 assert final_score <= max_score
関数呼び出し get_final_score(47,True) に対して AssertionError 例外が発生します。
Traceback (most recent call last): File "main.py", line 17, in <module> assert final_score <= max_score AssertionError
ここで、説明的な f-string を Python の assert ステートメントに追加します。
assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last): File "main.py", line 17, in <module> assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}" AssertionError: final_score should be at most 50; got 57
関数の変更
戻って get_final_score 関数の定義を変更し、予期しない動作を修正しましょう。
- 関数 get_final_score も max_score をパラメータとして取ります。
- ボーナスが True かどうかを確認します。 True の場合、スコア変数に 10 ポイントを追加します。
- 次に、スコアが max_score より大きいかどうかを確認します。 そうであれば、max_score を返します。
- それ以外の場合は、score を返します。
これで、最終スコアが常に max_score 以下になるようになりました。
def get_final_score(score,bonus,max_score): if bonus: score += 10 if score > max_score: return max_score return score
簡単な演習として、いくつかのアサーションを記述して、関数が期待どおりに機能することを確認します。
AssertionError 例外に関する注意
式が False と評価されると AssertionError 例外が発生しますが、そのようなエラーを例外として処理しないように注意する必要があります。 つまり、次のようなことをすべきではありません。
try: <doing this> except AssertionError: <do this>
前の get_final_score の例では、アサーションを使用して final_score が max_score より小さいかどうかを確認しました。 次に、アサーション エラーが発生しないように関数定義を変更しました。
それがアサーションの目的です。 それらはコードの健全性チェックであり、よりクリーンなコードを書くのに役立ちます。 一方、例外処理は、実行時に予期しないエラーを予測して処理することです。 これらには、多くの場合、無効な入力タイプと値が含まれます。
要約すると、効果的なデバッグのために Python assert ステートメントを使用し、AssertionErrors を例外として処理しないようにする必要があります。
結論
このチュートリアルは、Python で assert ステートメントを使用する方法を理解するのに役立ちました。 学んだことの要約は次のとおりです。
- Python assert ステートメント (アサーション) は assert 式の形式を取ります。 これは、式が True かどうかをチェックします。 True と評価されない場合、AssertionError 例外が発生します。
- assert は構文 assert expression, message で使用することもできます。 これにより、AssertionError 例外が発生するたびにメッセージ文字列が出力されます。
- アサーション エラーを処理するために例外処理を実装しないように注意してください。 また、コードのサニティ チェックに役立つデバッグ ツールとしてアサーションを使用します。
開発者として、アサーションはデバッグに役立ちます。 プロジェクトのすべての個々のコンポーネント (モジュール) が期待どおりに機能することを確認するには、Python で単体テストを作成する方法を学習できます。
次に、取り組むことができる初心者の Python プロジェクトのリストを確認してください。