Pythonでassert断言を優雅に使う方法

3728 ワード

assert断言とは
Assert statements are a convenient way to insert debugging assertions into a program.
断言声明はプログラムデバッグに使用する便利な方法です.断言はdebugツールと見なすことができ、Pythonの実現もこの設計哲学に合致し、Pythonにおけるassert文の実行は__debug__という内蔵変数に依存し、そのデフォルト値はTrueである.__debug__Trueである場合、assert文は実行されます.
一般的な宣言ではassert expressionは
if __debug__:
    if not expression: raise AssertionError

assertは、assert expression 1などの2つのexpressionを同時に宣言することができ、expression 2は
if __debug__:
    if not expression1: raise AssertionError(expression2)

スクリプトファイルを実行するときに-Oのパラメータを加えると、__debug__Falseになります.
例を挙げると、スクリプトtestAssertがあるとします.py、内容は:
print(__debug__)
assert 1 > 2
python assert.pyを使用して実行すると、__debug__はTrueを出力し、assert 1>2文はAssertionError異常を放出します.python -O assert.pyを使用して実行すると、__debug__はFalseを出力し、assert 1>2文は実行されていないため異常を報告しません.
ブレークスルーと例外の使用シーン
結論を先に言います.
チェック 使用断言、チェック 使用異常
例を挙げて説明しますが、開発ではローカルファイルを読み込むシーンがよくあります.read_を定義しますfileメソッド.
def read_file(path):
    assert isinstance(file_path, str)
    ...

read_file関数は実行開始時に一定の条件を満たすことを要求する:file_pathはstrタイプでなければなりません.この条件は先行条件です.満たさなければ、この関数を呼び出すことはできません.もし本当に条件を満たさない場合、コードにバグが発生したことを証明します.この場合、assert文を使用してfile_pathのタイプを推定し,プログラマにコードの修正を注意し,if...raise...文を用いてassertを実現することもできるが,煩雑である.多くの優秀なPythonプロジェクトではassertを使った先験判断が見られるので、普段から気をつけてください.
read_file関数は、呼び出されて実行された後も、file_などの一定の条件を満たす必要があります.pathが指定したファイルの必要性は存在し、現在のユーザーはこのファイルを読み取る権限があります.これらの条件を後験条件と呼び、後験条件の検査には異常を使用して処理する必要があります.
def read_file(file_path):
    assert isinstance(file_path, str)
    if not check_exist(file_path):
        raise FileNotFoundError()
    if not has_privilege(file_path):
        raise PermissionError()

ファイルが存在しない場合と権限がない場合、この2つの状況はコードバグではなく、コードロジックの一部であり、上位レベルのコードが異常をキャプチャした後に他のロジックが実行される可能性があるため、このコードが本番環境で無視されることは受け入れられません.また,assert文よりもAssertErrorのみを投げ出すことができ,例外を用いることでより詳細なエラーを投げ出すことができ,上位コードが異なるエラーに対して異なる論理を実行するのを容易にする.
リファレンスリンク