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
は、IDLEではなく完全なインタープリターで実行した場合に警告(_SyntaxWarning: assertion is always true, perhaps remove parentheses?
_)を出します。 assert
はキーワードであり、関数ではないため、実際にはTupleを最初の引数として渡し、2番目の引数を省略しています。
空でないタプルはTrue
に評価され、アサーションメッセージはオプションであるため、assert(1==2, "hi")
を書いたときに本質的に_assert True
_を呼び出したことを思い出してください。
複数行のアサートが必要なために括弧を挿入する場合、代替案は次のように行の最後にバックスラッシュを置くことです:
foo = 7
assert foo == 8, \
"derp should be 8, it is " + str(foo)
プリント:
AssertionError: "derp should be 8, it is 7
assert
は他のすべてのものと異なっていなければならない:Pythonのイデオロギーでは、プログラムはアサートをオンにするための特別なフラグを心配することなく自己修正するべきだと思います。アサートをオフにする誘惑は大きすぎるため、非推奨になっています。
python assert
が他のすべてのpythonプログラミング構成と比較してユニークな構文を持ち、この構文が再び変更されたことから、 python2からpython3に変更し、再びpython 3.4から3.6に変更しました。あらゆるバージョンから他のバージョンへのassert文の後方互換性をなくしました。
assert
が3番目のクラスの市民であるという肩のタップです。これはpython4で完全に削除され、確かにPython 8.1。
_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-キーワードです)の関数ではないため、括弧を使用しないでください。
次のように\
なしで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'
)
以下は 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