1. ホーム
  2. python

[解決済み] Pythonでアサーションを無効にする

2022-12-27 20:52:07

質問

Pythonでアサーションを無効にするにはどうすればよいですか?

つまり、アサーションが失敗したとき、私はそれが AssertionError を投げるのではなく、継続させるということです。

どうしたらいいんだろう?

どのように解決するのですか?

<ブロッククオート

Pythonでアサーションを無効にするには?

1つのプロセス、環境、または1行のコードに影響を与える複数のアプローチがあります。

それぞれを実演します。

全体の流れについて

を使用して -O フラグ (大文字の O) を使用すると、プロセス内のすべての assert ステートメントを無効にします。

例えば

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

disableというのは、それに続く式も実行しないという意味であることに注意してください。

$ python -Oc "assert 1/0"

$ python -c "assert 1/0"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

環境について

環境変数を使ってこのフラグを設定することもできます。

これは、その環境を使用または継承するすべてのプロセスに影響します。

例: Windows では、環境変数を設定してからクリアする。

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
C:\>SET PYTHONOPTIMIZE=TRUE

C:\>python -c "assert False"

C:\>SET PYTHONOPTIMIZE=

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

Unixでも同じ(setと アンセット を使う)

コード内の一点

あなたは質問を続けます。

アサーションが失敗した場合、AssertionErrorを投げず、そのまま続行させたい。

失敗したコードを実行させたい場合は、例えば制御フローがアサーションに到達しないようにするか、どちらかをキャッチすればよい。

if False:
    assert False, "we know this fails, but we don't get here"

または、アサーションエラーをキャッチすることができます。

try:
    assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
    print(repr(e))

というように印刷します。

AssertionError('this code runs, fails, and the exception is caught')

を処理したところから、続けて AssertionError .

参考文献

から assert ドキュメント :

こんな感じのassert文。

assert expression #, optional_message

と同等です。

if __debug__:
    if not expression: raise AssertionError #(optional_message)

そして

組み込み変数 __debug__True である。 False 最適化が要求された場合(コマンドラインオプション -O ).

さらに

<ブロッククオート

へのアサインメント __debug__ への代入は違法です。組み込み変数の値はインタプリタ起動時に決定されます。

使い方ドキュメントより。

-O

基本的な最適化をオンにします。これにより、コンパイル済み(バイトコード)ファイルのファイル名拡張子が.pycから.pyoに変更されます。PYTHONOPTIMIZEも参照してください。

ピュトノプティマイズ

空でない文字列を指定した場合、その文字列は を指定するのと同じです。 -O オプションを指定するのと同じです。整数を指定した場合,以下のようになる。 を指定するのと同じです。 -O を複数回指定するのと同じです。