かっこ付き/なしのPythonアサート


104

次に、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の呼び出しの違いは何ですか?私の習慣は括弧を使用することですが、上記は私がすべきでないことを示唆しています。


役立つ回答をありがとう。キーワードと組み込み関数の違いは微妙に見えます。キーワードのリストを以下に示しますが、私は推測しますが、括弧は省略
gaefan

2
1つの違いは、組み込み関数は再定義できますが、キーワードでは再定義できないことです(前者は良い考えではありません)。
gaefan

関数とキーワードの違いではなく、関数呼び出しステートメントの違いです。(たとえば、printは以前はステートメントであり、括弧なしで機能していました)。
Tomasz Gandor

回答:


129

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

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


10
その理由はassert (1==2)、単一の式を囲む括弧がタプルを自動的に作成しないためです。あなたがそうした場合、あなたは#4と同じ振る舞いをするでしょうassert (1==2,)。同じことは、のprint ('foo', 'bar')代わりに行った場合にも起こりますprint 'foo', 'bar'。出力されたタプルが表示されます
Michael Mrozek

フォームのステートメントがassert(test, message)おそらく間違っていること、そして確かに混乱することをさらに強調する価値があります。かっこなし!
tcarobruce

19
では、PES8に関して、長いassertステートメントをインデントする適切な方法は何ですか?不可能のようです。
スタントン2013


30

複数行のアサートが必要なためにかっこをそこに配置する場合、次のように行の最後にバックスラッシュを配置する方法もあります。

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は三等市民である肩のタップです、それはpython4で完全に削除されます、そして確かにPython 8.1でも再びです。


2
アサートの代わりに何を使用するべきかに関するドキュメントはありますか?アサートは検証のためのそのような論理名のように見え、エラー時に特別なメッセージを表示するなど、望ましい動作をします。
AnneTheAgile

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")assert (1==2, "hi")空ではないタプルが原因でエラーが発生しないため、として解析されます(False, "hi")偽の値ではなく、キーワードに供給されない第二のパラメータは存在しません。

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


13

次の\ようにせずに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'
)

1
面白いアイデア。私は継続のためのバックスラッシュが嫌いで、これはアサートをユーティリティ関数でラップする代わりの方法です(これが私の解決策でした)。
Tomasz Gandor

1

以下はpythonのドキュメントから引用されています

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

assert_stmt ::= "assert" expression ["," expression]

単純な形式である表明式は、次のものと同等です。 if __debug__: if not expression: raise AssertionError

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

したがって、ここで括弧を使用している場合は、単純な形式を使用しており、式はタプルとして評価されます。これは、ブール値にキャストされると常にTrueになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.