web-dev-qa-db-fra.com

parenthèses dans Python Conditionals

J'ai une simple question concernant l'utilisation de parenthèses dans les instructions conditionnelles Python.

Les deux extraits suivants fonctionnent exactement de la même manière, mais je me demande si cela n’est vrai que par sa simplicité;

>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

et maintenant sans parenthèses

>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

Quelqu'un pourrait-il aider à nous éclairer? Existe-t-il des cas où je devrais absolument les utiliser?

17
Flowpoke

Les autres réponses que la comparaison a lieu avant la valeur booléenne sont correctes à 100%. En guise d'alternative (pour des situations comme celle que vous avez démontrée), vous pouvez également l'utiliser pour combiner les conditions suivantes:

if socket.gethostname() in ('bristle', 'rete'):
  # Something here that operates under the conditions.

Cela vous évite les appels séparés vers socket.gethostname et facilite l'ajout de valeurs valides possibles au fur et à mesure que votre projet se développe ou que vous devez autoriser d'autres hôtes.

35
g.d.d.c

Les parenthèses sont redondantes dans ce cas. La comparaison a une priorité plus élevée que les opérateurs booléens. Par conséquent, les comparaisons seront toujours effectuées en premier, quelles que soient les parenthèses.

Cela dit, une ligne directrice que j'ai déjà vue (peut-être dans Programmation pratique en C) disait quelque chose comme ceci:

  1. Multiplication et division en premier
  2. Addition et soustraction suivant
  3. Parenthèses autour de tout le reste

(Oui, IIRC ils ont laissé exponentiation!)

L'idée étant que les règles de priorité sont suffisamment obscures pour que personne ne soit censé les mémoriser toutes, ni le programmeur d'origine ni le programmeur de maintenance lisant le code, il est donc préférable de le rendre explicite. Essentiellement, les parenthèses servent à la fois à communiquer l’intention au compilateur et à servir de documentation au prochain schmoe qui doit y travailler.

Je crois qu'en Python, ces deux instructions génèreront le même bytecode, de sorte que vous ne perdez même pas votre efficacité.

9
kindall

La parenthèse force simplement un ordre d'opérations. Si vous avez une partie supplémentaire dans votre conditionnel, telle qu'un "et", il est conseillé d'utiliser une parenthèse pour indiquer lequel "ou" cela "et" couplé.

if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
    ...

Se différencier de

if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
    ...
6
James

En Python et dans beaucoup d'autres langages de programmation, les parenthèses ne sont pas obligatoires pour toutes les expressions comportant plusieurs opérateurs. En effet, les opérateurs ont une priorité définie. Voir le tableau ici (Section 5.15) pour plus d’informations sur la priorité des opérateurs en Python. 

Vous pouvez faire une analogie avec l'arithmétique. Ces expressions sont équivalentes:

5 * 5 + 3

(5 * 5) + 3

Si vous voulez ajouter trois en premier, vous devez utiliser les parenthèses comme ceci:

5 * (5 + 3)
2
James Thompson

Regardez le manuel . Plus vous êtes en haut de la liste, l'opérateur sera appliqué plus tard. "ou" est supérieur à "==", et par conséquent, dans ce cas particulier, les réponses sont les mêmes. Cependant, pour des raisons de lisibilité, et juste pour être sûr, je recommanderais une parenthèse.

0
jarondl