質問

い無効の主張に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__

代入は違法です。インタプリタの起動時に組み込み変数の値が決定される。

使用状況のドキュメントから:

  

-O

     

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

  

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top