103

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

つまり、アサーションが失敗した場合、 をスローするのAssertionErrorではなく、続行する必要があります。

それ、どうやったら出来るの?

4

6 に答える 6

61

-O フラグを指定して Python を呼び出します。

test.py:

assert False
print('Done')

出力:

C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    assert(False)
AssertionError

C:\temp\py>C:\Python26\python.exe -O test.py
Done
于 2009-08-13T16:53:41.960 に答える
16

既に与えられた 2 つの回答はどちらも有効です (コマンド ラインで または の-Oいずれかを使用して Python を呼び出します)。-OO

Python documentationから、それらの違いは次のとおりです。

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

  • -OO最適化に加えてdocstring を破棄します。-O

アサーションが有効か無効かを確認するには、 の値を参照してください__debug__

于 2014-01-24T05:45:49.307 に答える
8

使用python -O:

$ python -O
>>> assert False
>>> 
于 2009-08-13T16:52:12.180 に答える
2

アサーションを無効にしないでください。注意が他の場所にあるときに、予期しないエラーをキャッチします。「10 の累乗」 ( DOIウィキペディア) のルール 5 を参照してください。

raiseステートメントの代わりにassertステートメントを書きます。

if x_is_broken():
    raise RuntimeError('`x` is broken.')

Python が実行される最適化オプションに関係なく、raiseステートメントは存在し続けます。また、raiseステートメントを使用すると、 とは異なるタイプの例外を指定できますAssertionError。これはユーザーにとって非常に便利です。また、ステートメントを書くだけで、そこに正しい選択があるraiseかどうかを自問するよう促されます。AssertionError

さらに、raiseステートメントを書くとき、例えばraise AssertionError('An error occurred with `x`.'). 文中にエラーメッセージを書くこと可能ですがassert(例えば、assert x, 'An error occurred with `x`.'複数行にまたがるメッセージには , や括弧を使用できます)、忘れられる可能性があります。対照的に、は入力raise AssertionError(....)が必要です....(フォームraise AssertionErrorは一般的ではなく、推奨されません)。

エラーメッセージを書くとき、さらに多くのコーディングエラーが明らかになることは注目に値します。

補足: 計算コストの高いアサーション チェックは、要求された場合にのみ実行できます。1 つの方法は次のとおりです。

import logging


log = logging.getLogger(__name__)


if log.getEffectiveLevel() < logging.DEBUG:
    if not check_expensive_property(x):
        raise RuntimeError('`x` is broken.')
于 2015-04-20T07:41:51.647 に答える
2

最適化モードで実行すると、次のようになります。

python -OO module.py
于 2009-08-13T16:52:09.653 に答える