私はいくつかのソース コードを読んでいて、いくつかの場所でassert
.
正確にはどういう意味ですか?その使用法は何ですか?
このassert
ステートメントは、ほぼすべてのプログラミング言語に存在します。主に次の 2 つの用途があります。
後で他の操作が失敗したときに問題を検出するのではなく、原因が明らかなプログラムの早い段階で問題を検出するのに役立ちます。たとえば、Python の型エラーは、Exception
早い段階で発見されなければ、実際に if が発生する前に、コードのいくつかのレイヤーを通過する可能性があります。
これは、コードを読んでいる他の開発者のためのドキュメントとして機能し、それらの開発者は を見てassert
、自信を持ってその条件が今後も維持されると言うことができます。
あなたがするとき...
assert condition
...その条件をテストし、条件が偽の場合はすぐにエラーをトリガーするようにプログラムに指示しています。
Python では、これとほぼ同等です。
if not condition:
raise AssertionError()
Python シェルで試してみます。
>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
アサーションにはオプションのメッセージを含めることができ、インタープリターの実行時にそれらを無効にすることができます。
アサーションが失敗した場合にメッセージを出力するには:
assert False, "Oh no! This assertion failed!"
関数のように呼び出すために括弧を使用しないでくださいassert
。声明です。その場合、タプルを最初のパラメーターとしてassert(condition, message)
実行します。assert
(condition, message)
それらを無効にすることに関してはpython
、最適化モードで実行している場合、 __debug__
is False
、 assert ステートメントは無視されます。-O
フラグを渡すだけです:
python -O script.py
関連ドキュメントについては、こちらを参照してください。
括弧に注意してください。他の回答で指摘されているように、Python 3 ではassert
まだ statementであるため、 との類推により、 orprint(..)
に同じものを推定することはできますが、そうすべきではありません。assert(..)
raise(..)
これは間違っています:
assert(2 + 2 == 5, "Houston we've got a problem")
正解です:
assert 2 + 2 == 5, "Houston we've got a problem"
最初のものが機能しない理由は、それが とbool( (False, "Houston we've got a problem") )
評価されるためTrue
です。
ステートメントassert(False)
では、これらは の周りの冗長な括弧False
であり、その内容に評価されます。しかしassert(False,)
、括弧はタプルになり、空でないタプルTrue
はブール値のコンテキストで評価されます。
他の回答が指摘しているようにassert
、特定の条件が真でない場合に例外をスローすることに似ています。重要な違いは、最適化オプションを使用してコードをコンパイルすると assert ステートメントが無視されることです-O
。ドキュメンテーションによると、それは次のassert expression
ものと同等であるとよりよく説明できます
if __debug__:
if not expression: raise AssertionError
これは、コードを徹底的にテストし、どのアサーション ケースも失敗しないことに満足しているときに最適化されたバージョンをリリースする場合に役立ちます。最適化がオンの場合、__debug__
変数は False になり、条件の評価が停止します。この機能は、アサーションに依存していて、アサーションが消えたことに気付いていない場合にも問題を引き起こす可能性があります。
他の人はすでにドキュメントへのリンクを提供しています。
対話型シェルで次のことを試すことができます。
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
最初のステートメントは何もしませんが、2 番目のステートメントは例外を発生させます。これが最初のヒントです。アサートは、コードの特定の位置 (通常は、関数の開始 (前提条件) と終了 (事後条件)) で真であるべき条件をチェックするのに役立ちます。
アサートは実際には契約によるプログラミングと密接に結びついており、これは非常に有用なエンジニアリング手法です。
ドキュメントから:
assert ステートメントは、デバッグ アサーションをプログラムに挿入する便利な方法です。
ここで詳細を読むことができます: http://docs.python.org/release/2.5.2/ref/assert.html
assert ステートメントには 2 つの形式があります。
単純な形式 ,assert <expression>
は次と同等です
if __debug__:
if not <expression>: raise AssertionError
拡張形式 はassert <expression1>, <expression2>
、
if __debug__:
if not <expression1>: raise AssertionError(<expression2>)
アサーションは、プログラムの内部状態がプログラマーの期待どおりであることを確認するための体系的な方法であり、バグをキャッチすることを目的としています。以下の例を参照してください。
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
assert の後のステートメントが true の場合、プログラムは続行しますが、assert の後のステートメントが false の場合、プログラムはエラーを返します。そのような単純な。
例えば:
assert 1>0 #normal execution
assert 0>1 #Traceback (most recent call last):
#File "<pyshell#11>", line 1, in <module>
#assert 0>1
#AssertionError
Python で予約済み関数が何をするかを正確に知りたい場合は、次のように入力します。help(enter_keyword)
予約済みのキーワードを入力する場合は、必ず文字列として入力してください。
assert
Python のキーワードは、キーワードに続くコードが の場合に an を発生させAssertionError
ます。そうでない場合は、何も起こらなかったとして続行します。assert
False
例 1 :
a = 5
b = 6
assert a == b
出力:
AssertionError
これは、明らかにa
が等しくないためb
です。これは、コードで を発生させたい場合に特に便利ですException
。
def get_dict_key(d, k):
try:
assert k in d
return d[k]
except Exception:
print("Key must be in dict.")
上記の例は実際には役に立ちませんが、主にデバッグ目的で使用されるため、バグを追跡することができます。