あなたはプログラマーですか?そうであれば、コーディングしている言語に関係なく、デバッグは不可欠なスキルです。この記事では、効果的なデバッグのために Python で Assert ステートメント を使用する方法を学びます。
プロジェクトに取り組んでいるときは、複数のモジュールを定義します。これには、関数、クラス定義などが含まれます。また、実装のバグにより、エラーや予期しない結果が発生する可能性があります。 Assert ステートメントは、このようなコードのデバッグに役立ちます。
このチュートリアルでは、assert ステートメントを使用するための構文を学習し、その後、実際の動作を確認するコード例を示します。また、アサーション エラーとは何か、また、アサーション エラーを使用して開発中にコード内のエラーを修正する方法についても説明します。
さぁ、始めよう!

Python で Assert ステートメントを使用する方法
ここでは、assert ステートメントを使用するための構文を学習してから、いくつかの例のコーディングに進みます。
Assert ステートメントの構文
Python でassert ステートメントを使用するための構文から始めましょう。
assert expression, message
ここ、
-
expression
評価される任意の有効な Python 式です。これは、変数の値、変数の真理値、関数からの戻り値などに関する条件になります。 -
expression
がTrue
と評価される限り、assert ステートメントはエラーをスローしたり、何も返したりしません。これは、プログラムが期待どおりに動作することを示しています。 -
expression
がTrue
でなくなった場合、AssertionError
例外が発生します。 -
message
オプションの 文字列です。AssertionError
例外が発生するたびにトレースバックに表示されるメッセージを指定できます。
次に、assert ステートメントがよりクリーンでバグのないコードを作成するのに役立ついくつかの例のコーディングに進みましょう。
このチュートリアルで使用されているコード例は 、この GitHub gist にあります。

Python の Assert ステートメントの例

次の例を考えてみましょう。コードに
discount
変数があるとします。ただし、その値が常に
max_discount
以下であることが必要です。
誤って
discount
変数に値を設定しなかったことを確認するには、アサーションを追加します。評価する式は次のとおりです:
discount <= max_discount
。
>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount
ここで、
discount
(20) は
max_discount
(50) よりも小さいです。したがって、assert ステートメントはエラーをスローしません。
AssertionError 例外
discount
変数が
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
について考えてみましょう。
-
現在のスコア、
score
、およびブール値bonus
を受け取ります。 -
学生がボーナスの質問に回答した場合、ブール値
bonus
はTrue
となり、現在のスコアより 10 ポイント多く獲得します。 - その後、関数は最終スコアを返します。
def get_final_score(score,bonus):
if bonus:
score += 10
return score
関数をいくつか呼び出してみましょう。
bonus
が
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
ここで、Python のアサート ステートメントに説明的な f 文字列を追加します。
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
も受け取ります。 -
bonus
True かどうかを確認します。 True の場合、スコア変数に 10 ポイントを追加します。 -
次に、
score
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 expression
形式を取ります。これにより、expression
がTrue
かどうかがチェックされます。True
と評価されない場合、AssertionError
例外が発生します。 -
また、assert を
assert expression, message
構文とともに使用することもできます。これにより、AssertionError
例外が発生するたびにmessage
文字列が出力されます。 -
アサーション エラーを処理するために例外処理を実装しないように注意してください。また、コードの健全性をチェックするための便利なデバッグ ツールとしてアサーションを使用します。
開発者にとって、アサーションはデバッグに役立ちます。プロジェクトのすべての個々のコンポーネント (モジュール) が期待どおりに動作することを確認するには、Python で単体テストを作成する方法を学びます。
次に、取り組むことができる初心者向け Python プロジェクトのリストを確認してください。