テクノロジー 開発 非公開: Python Assert ステートメントを使用した効果的なデバッグ

Python Assert ステートメントを使用した効果的なデバッグ

あなたはプログラマーですか?そうであれば、コーディングしている言語に関係なく、デバッグは不可欠なスキルです。この記事では、効果的なデバッグのために Python で Assert ステートメント を使用する方法を学びます。

プロジェクトに取り組んでいるときは、複数のモジュールを定義します。これには、関数、クラス定義などが含まれます。また、実装のバグにより、エラーや予期しない結果が発生する可能性があります。 Assert ステートメントは、このようなコードのデバッグに役立ちます。

このチュートリアルでは、assert ステートメントを使用するための構文を学習し、その後、実際の動作を確認するコード例を示します。また、アサーション エラーとは何か、また、アサーション エラーを使用して開発中にコード内のエラーを修正する方法についても説明します。

さぁ、始めよう!

Python Assert ステートメントを使用した効果的なデバッグ
Python 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 ステートメントを使用した効果的なデバッグ
Python Assert ステートメントを使用した効果的なデバッグ

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

Python の Assert ステートメントの例
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 変数の値が含まれるようになりました。

Python Assert ステートメントを使用した効果的なデバッグ
Python Assert ステートメントを使用した効果的なデバッグ

Assert を使用した Python 関数のデバッグとテスト

関数を定義するときに、関数が意図したとおりに動作しないバグ (論理エラー) を誤って導入してしまうことがあります。

Assert を使用した Python 関数のデバッグとテスト
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 プロジェクトのリストを確認してください。

「 Python Assert ステートメントを使用した効果的なデバッグ」についてわかりやすく解説!絶対に観るべきベスト2動画

Pythonのデバッグ機能を使ってみよう!
【ゼロから丁寧に始めるpython#10】エラーの種類とデバック

あなたはプログラマーですか?そうであれば、コーディングしている言語に関係なく、デバッグは不可欠なスキルです。この記事では、効果的なデバッグのために Python で Assert ステートメント を使用する方法を学びます。

プロジェクトに取り組んでいるときは、複数のモジュールを定義します。これには、関数、クラス定義などが含まれます。また、実装のバグにより、エラーや予期しない結果が発生する可能性があります。 Assert ステートメントは、このようなコードのデバッグに役立ちます。

このチュートリアルでは、assert ステートメントを使用するための構文を学習し、その後、実際の動作を確認するコード例を示します。また、アサーション エラーとは何か、また、アサーション エラーを使用して開発中にコード内のエラーを修正する方法についても説明します。

さぁ、始めよう!

Python Assert ステートメントを使用した効果的なデバッグ
Python 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 ステートメントを使用した効果的なデバッグ
Python Assert ステートメントを使用した効果的なデバッグ

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

Python の Assert ステートメントの例
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 変数の値が含まれるようになりました。

Python Assert ステートメントを使用した効果的なデバッグ
Python Assert ステートメントを使用した効果的なデバッグ

Assert を使用した Python 関数のデバッグとテスト

関数を定義するときに、関数が意図したとおりに動作しないバグ (論理エラー) を誤って導入してしまうことがあります。

Assert を使用した Python 関数のデバッグとテスト
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 プロジェクトのリストを確認してください。

「 Python Assert ステートメントを使用した効果的なデバッグ」についてわかりやすく解説!絶対に観るべきベスト2動画

Pythonのデバッグ機能を使ってみよう!
【ゼロから丁寧に始めるpython#10】エラーの種類とデバック