126

assert の 4 つの簡単な呼び出しを次に示します。

>>> assert 1==2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert 1==2, "hi"
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError: hi

>>> assert(1==2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert(1==2, "hi")

最後のものはエラーを発生させないことに注意してください。この動作を引き起こすかっこの有無にかかわらず assert を呼び出すことの違いは何ですか? 私の練習では括弧を使用しますが、上記は使用すべきではないことを示唆しています。

4

5 に答える 5

150

最後は、IDLE ではなく完全なインタープリターを介して実行した場合assert、警告 ( ) が表示されます。SyntaxWarning: assertion is always true, perhaps remove parentheses?は関数ではなくキーワードであるためassert、実際には最初の引数としてタプルを渡し、2 番目の引数を省略しています。

空でないタプルは に評価されることを思い出してくださいTrue。また、アサーション メッセージはオプションであるため、基本的には を記述しassert Trueたときに呼び出したことになりますassert(1==2, "hi")

于 2010-06-24T17:00:58.230 に答える
42

複数行のアサートが必要なためにそこに括弧を入れる場合は、次のように行末にバックスラッシュを付けることもできます。

foo = 7
assert foo == 8, \
    "derp should be 8, it is " + str(foo)

版画:

AssertionError: "derp should be 8, it is 7

assertこの pythonが他のすべてのものと異なる必要があるのはなぜですか。

Pythonic のイデオロギーは、アサートを有効にする特別なフラグを気にすることなく、プログラムが自己修正する必要があるということだと思います。アサートを無効にしたいという誘惑が強すぎるため、非推奨になりました。

Pythonassertには、他のすべての Python プログラミング構成要素と比較して固有の構文があり、この構文が python2 から python3 に、また python 3.4 から 3.6 に再び変更されているというご不満を共有しています。任意のバージョンから他のバージョンへの後方互換性を持たない assert ステートメントを作成します。

これは第 3 級市民である肩をassert軽くたたくことであり、python4 では完全に削除され、Python 8.1 では確実に削除されます。

于 2015-07-07T15:16:02.490 に答える
18

assert 1==2, "hi"assert 1==2, "hi"は、キーワードの 2 番目のパラメーターとして「hi」を使用して解析されます。したがって、なぜ適切にエラーが発生するのですか。

assert(1==2)assert (1==2)はと同じものとして解析されます。これはassert 1==2、単一の項目を囲む括弧は、末尾にカンマがない限りタプルを作成しないため(1==2,)です。

assert(1==2, "hi")空でないタプルはfalse 値ではなく、キーワードに指定された 2 番目のパラメーターがないassert (1==2, "hi")ため、エラーは発生しません。(False, "hi")

assertは Python の関数ではないため、括弧は使用しないでください。これはキーワードです。

于 2010-06-24T17:03:17.663 に答える