1311

私はいくつかのソース コードを読んでいて、いくつかの場所でassert.

正確にはどういう意味ですか?その使用法は何ですか?

4

22 に答える 22

1519

このassertステートメントは、ほぼすべてのプログラミング言語に存在します。主に次の 2 つの用途があります。

  1. 後で他の操作が失敗したときに問題を検出するのではなく、原因が明らかなプログラムの早い段階で問題を検出するのに役立ちます。たとえば、Python の型エラーは、Exception早い段階で発見されなければ、実際に if が発生する前に、コードのいくつかのレイヤーを通過する可能性があります。

  2. これは、コードを読んでいる他の開発者のためのドキュメントとして機能し、それらの開発者は を見て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

関連ドキュメントについては、こちらを参照してください。

于 2011-02-28T13:15:33.593 に答える
554

括弧に注意してください。他の回答で指摘されているように、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はブール値のコンテキストで評価されます。

于 2015-06-11T02:15:30.310 に答える
169

他の回答が指摘しているようにassert、特定の条件が真でない場合に例外をスローすることに似ています。重要な違いは、最適化オプションを使用してコードをコンパイルすると assert ステートメントが無視されることです-Oドキュメンテーションによると、それは次のassert expressionものと同等であるとよりよく説明できます

if __debug__:
   if not expression: raise AssertionError

これは、コードを徹底的にテストし、どのアサーション ケースも失敗しないことに満足しているときに最適化されたバージョンをリリースする場合に役立ちます。最適化がオンの場合、__debug__変数は False になり、条件の評価が停止します。この機能は、アサーションに依存していて、アサーションが消えたことに気付いていない場合にも問題を引き起こす可能性があります。

于 2011-02-28T14:10:37.460 に答える
56

他の人はすでにドキュメントへのリンクを提供しています。

対話型シェルで次のことを試すことができます。

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

最初のステートメントは何もしませんが、2 番目のステートメントは例外を発生させます。これが最初のヒントです。アサートは、コードの特定の位置 (通常は、関数の開始 (前提条件) と終了 (事後条件)) で真であるべき条件をチェックするのに役立ちます。

アサートは実際には契約によるプログラミングと密接に結びついており、これは非常に有用なエンジニアリング手法です。

http://en.wikipedia.org/wiki/Design_by_contract .

于 2011-02-28T13:18:19.973 に答える
24

ドキュメントから:

assert ステートメントは、デバッグ アサーションをプログラムに挿入する便利な方法です。

ここで詳細を読むことができます: http://docs.python.org/release/2.5.2/ref/assert.html

于 2011-02-28T13:16:38.100 に答える
21

assert ステートメントには 2 つの形式があります。

単純な形式 ,assert <expression>は次と同等です

if __​debug__:
    if not <expression>: raise AssertionError

拡張形式 はassert <expression1>, <expression2>

if __​debug__:
    if not <expression1>: raise AssertionError(<expression2>)
于 2013-07-10T01:21:45.477 に答える
18

アサーションは、プログラムの内部状態がプログラマーの期待どおりであることを確認するための体系的な方法であり、バグをキャッチすることを目的としています。以下の例を参照してください。

>>> 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!
>>> 
于 2014-02-19T16:52:57.763 に答える
7

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
于 2014-11-01T05:05:43.010 に答える
3

Python で予約済み関数が何をするかを正確に知りたい場合は、次のように入力します。help(enter_keyword)

予約済みのキーワードを入力する場合は、必ず文字列として入力してください。

于 2015-07-16T03:51:02.987 に答える
1

assertPython のキーワードは、キーワードに続くコードが の場合に an を発生させAssertionErrorます。そうでない場合は、何も起こらなかったとして続行します。assertFalse

例 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.")

上記の例は実際には役に立ちませんが、主にデバッグ目的で使用されるため、バグを追跡することができます。

于 2017-07-26T17:19:01.663 に答える