Python でアサーションを無効にするにはどうすればよいですか?
つまり、アサーションが失敗した場合、 をスローするのAssertionError
ではなく、続行する必要があります。
それ、どうやったら出来るの?
Python でアサーションを無効にするにはどうすればよいですか?
つまり、アサーションが失敗した場合、 をスローするのAssertionError
ではなく、続行する必要があります。
それ、どうやったら出来るの?
-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
既に与えられた 2 つの回答はどちらも有効です (コマンド ラインで または の-O
いずれかを使用して Python を呼び出します)。-OO
Python documentationから、それらの違いは次のとおりです。
-O
基本的な最適化をオンにします。これにより、コンパイル済み (バイトコード) ファイルのファイル名拡張子が .pyc から .pyo に変更されます。
-OO
最適化に加えてdocstring を破棄します。-O
アサーションが有効か無効かを確認するには、 の値を参照してください__debug__
。
使用python -O
:
$ python -O
>>> assert False
>>>
アサーションを無効にしないでください。注意が他の場所にあるときに、予期しないエラーをキャッチします。「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.')
最適化モードで実行すると、次のようになります。
python -OO module.py