web-dev-qa-db-ja.com

pythonかっこありとなしのアサート

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

最後のものはエラーを発生させないことに注意してください。この動作を引き起こすカッコ付きまたはカッコなしのアサートの違いは何ですか?私の練習は括弧を使用することですが、上記のことは、使用すべきでないことを示唆しています。

85
gaefan

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

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

104
Mark Rushakoff

複数行のアサートが必要なために括弧を挿入する場合、代替案は次のように行の最後にバックスラッシュを置くことです:

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

プリント:

AssertionError: "derp should be 8, it is 7

なぜこれpython assertは他のすべてのものと異なっていなければならない:

Pythonのイデオロギーでは、プログラムはアサートをオンにするための特別なフラグを心配することなく自己修正するべきだと思います。アサートをオフにする誘惑は大きすぎるため、非推奨になっています。

python assertが他のすべてのpythonプログラミング構成と比較してユニークな構文を持ち、この構文が再び変更されたことから、 python2からpython3に変更し、再びpython 3.4から3.6に変更しました。あらゆるバージョンから他のバージョンへのassert文の後方互換性をなくしました。

assertが3番目のクラスの市民であるという肩のタップです。これはpython4で完全に削除され、確かにPython 8.1。

20
Eric Leschinski

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

assert(1==2)assert (1==2)として解析されます。これは_assert 1==2_と同じです。単一のアイテムの周りの括弧は、末尾にコンマがない限りタプルを作成しないためです。 _(1==2,)_。

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

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

15
Amber

次のように\なしでassertステートメントを中断できます:

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

または、さらに長いメッセージがある場合:

foo = 7
assert foo == 8, (
    'Lorem Ipsum is simply dummy text of the printing and typesetting '
    'industry. Lorem Ipsum has been the industry\'s standard dummy text '
    'ever since the 1500s'
)
8
karantan

以下は python doc から引用されています

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

_assert_stmt ::= "assert" expression ["," expression]_

単純な形式のアサート式は_if __debug__: if not expression: raise AssertionError_と同等です

拡張形式、assert expression1、expression2は、if __debug__: if not expression1: raise AssertionError(expression2)と同等です

したがって、ここで括弧を使用している場合は、単純な形式を使用しており、式はタプルとして評価され、bool

1
VicX