Python条件文での括弧の使用に関する簡単な質問があります。
次の2つのスニペットはまったく同じように機能しますが、単純であるためにこれが本当かどうかは疑問です。
>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
そして今、括弧なしで
>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
誰かがこれにいくつかの光を当てるのを手伝ってもらえますか?私は間違いなくそれらを使用する必要がありますか?
ブール値の前に比較が行われるという他の答えは、100%正しいです。別の方法として(これまで示してきたような状況の場合)、条件を組み合わせる方法としてこれを使用することもできます。
if socket.gethostname() in ('bristle', 'rete'):
# Something here that operates under the conditions.
これにより、socket.gethostnameの個別の呼び出しが不要になり、プロジェクトが拡大したり、追加のホストを承認する必要がある場合に、有効な値を簡単に追加できるようになります。
括弧は単に操作の順序を強制します。 「and」など、条件に追加の部分がある場合は、括弧を使用して、「and」と「and」のペアを示すことをお勧めします。
if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
...
と区別するために
if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
...
この場合、括弧は冗長です。比較はブール演算子より優先順位が高いため、括弧に関係なく常に比較が最初に実行されます。
とはいえ、私がかつて見たガイドライン(おそらく実用的なCプログラミング)は次のようなことを言っていました。
(はい、IIRCはべき乗を省きました!)
優先順位ルールは非常に不可解であるため、コードを読んでいる元のプログラマーでも保守プログラマーでも、誰もそれらをすべて覚えておく必要はないという考えです。基本的に、括弧はコンパイラーに意図を伝えるためと、それに取り組む必要がある次のschmoeのドキュメントとしての役割を果たします。
Pythonこれらの2つのステートメントは同じバイトコードを生成するので、効率が低下することさえありません。
Pythonおよび他の多くのプログラミング言語では、複数の演算子を含むすべての式に括弧は必要ありません。これは、演算子に定義済みの優先順位があるためです。表を参照してください here (セクション5.15)Pythonの演算子の優先順位に関する情報。
算術に類推できます。これらの式は同等です。
5 * 5 + 3
(5 * 5) + 3
最初に3つ追加する場合は、次のように括弧を使用する必要があります。
5 * (5 + 3)
マニュアル をご覧ください。リストの上位にいるほど、演算子は後で適用されます。 「または」は「==」の上にあるため、この特定のケースでは答えは同じです。ただし、読みやすくするために、また念のために、かっこをお勧めします。