無効の主張にPython
-
13-09-2019 - |
質問
い無効の主張にPython?
この場合には、アサーションが失敗しないで投げる AssertionError
, っています。
そうい?
解決
どのように私はPythonでアサーションを無効にするには?
単一のプロセス、環境、または単一のコード行に影響を与える複数のアプローチがあります。
私はそれぞれを示します。
全体のプロセスのために
-O
フラグ(資本O)を使用すると、すべてのプロセスで文をアサート無効にします。
例
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
私は意味を無効にすることによって、それはまた、それを次の式を実行しないことに注意してください
$ 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の中に同じ解除セットとそれぞれの機能のため)
コード内のシングルポイント
あなたの質問を続行します:
アサーションが失敗した場合は、、私はそれが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 expression #, optional_message
タグと同等です
if __debug__: if not expression: raise AssertionError #(optional_message)
そして、
最適化が要求されたときに、組み込み変数
__debug__
は(コマンドラインオプションTrue
)通常の状況下でFalse
、-O
である。
、さらに
__debug__
に代入は違法です。インタプリタの起動時に組み込み変数の値が決定される。
使用状況のドキュメントから:
基本的な最適化をオンにします。これは.pyoする.pycファイルからコンパイル(バイトコード)ファイルのファイル名の拡張子を変更します。またPYTHONOPTIMIZEを参照してください。
と
これは非空の文字列に設定されている場合は、それは同じです
-O
オプションを指定します。整数に設定されている場合、それは同等です-O
複数回指定します。
他のヒント
-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
両方の回答の意思決定に際して有効です(呼びPythonのいずれか -O
または -OO
のコマンドライン)
ここでは、これらの差額について:
-O
番基本的な最適化.この変更はファイル名の拡張子 のため(bytecode)ファイルです。pycます。pyo.-OO
廃棄docstring のほか、 の-O
最適化.
からの Pythonドキュメント)
python -O
を使用します:
$ python -O
>>> assert False
>>>
あなたはずの をしないで無効(ほとんど)アサーション。注意が他の場所であるとき、彼らは予期しないエラーをキャッチ。 にの "10の力" をルール5を参照してください。
その代わり、のようなもので、いくつかの高価なアサーションチェックを守るます:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
重要なアサーションを維持し、assert
文が離れて最適化することができるようにする一つの方法は、選択文の中で、それらを上げることである。
if foo_is_broken():
raise AssertionError('Foo is broken!')
最適化モードで実行すると、それを行う必要があります:
python -OO module.py