54 votes

Parenthèses dans les conditionnels Python

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

Les deux extraits suivants fonctionnent de la même manière, mais je me demande si ce n'est pas uniquement dû à sa simplicité :

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

et maintenant sans les parenthèses

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

Quelqu'un peut-il m'éclairer à ce sujet ? Y a-t-il des cas où je devrais absolument les utiliser ?

53voto

g.d.d.c Points 20164

Les autres réponses indiquant que la comparaison a lieu avant le booléen sont correctes à 100%. Comme alternative (pour des situations comme celle que vous avez démontrée), vous pouvez également l'utiliser comme moyen de combiner les conditions :

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

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

25voto

James Points 3829

Les parenthèses forcent simplement un ordre d'opérations. Si vous aviez une partie supplémentaire dans votre conditionnel, telle qu'une and il est conseillé d'utiliser des parenthèses pour indiquer quel est le nom de l'entreprise. or que and jumelé avec.

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

Pour se différencier de

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

13voto

kindall Points 60645

Les parenthèses sont redondantes dans ce cas. La comparaison a une priorité plus élevée que les opérateurs booléens, donc les comparaisons seront toujours effectuées en premier, indépendamment des parenthèses.

Cela dit, une ligne directrice que j'ai vue une fois (peut-être dans Programmation C pratique) a dit quelque chose comme ça :

  1. Multiplication et division d'abord
  2. Addition et soustraction suivantes
  3. Parenthèses autour de tout le reste

(Oui, IIRC ils ont laissé de côté l'exponentiation !)

L'idée est que les règles de précédence sont suffisamment obscures pour que personne ne soit censé s'en souvenir, ni le programmeur d'origine ni le programmeur de maintenance qui lit le code, et qu'il est donc préférable de les rendre explicites. Essentiellement, les parenthèses servent à la fois à communiquer l'intention au compilateur et à servir de documentation pour le prochain imbécile qui devra travailler dessus.

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

13voto

The Godfather Points 898

J'ai toujours pensé que cela faisait partie PEP8 mais apparemment, ce n'est pas le cas. Cependant, dans tous les exemples que vous rencontrez dans les PEP, les exemples de code et la documentation, vous ne voyez jamais de parenthèses redondantes (il y a même une telle inspection dans PyCharm, par exemple).

Il est généralement recommandé de n'utiliser les parenthèses que si cela améliore la lisibilité ou si vous souhaitez réellement modifier l'ordre de calcul d'une expression (par exemple (a or b) and c ).

Faites :

  if (first_expr or second_expr) and third_expr:    

  if first_expr or second_expr:

Ne fais pas ça. :

  if ((first_expr or second_expr) and third_expr):    

  if (first_expr):

  if (first_expr or (second_expr and third_expr)):

Dans votre exemple de code, les parenthèses sont complètement redondantes, utilisez simplement if socket.gethostname() == "bristle" or socket.gethostname() == "rete": (dans le code de production, bien sûr, in sera beaucoup plus lisible, mais c'est plutôt hors sujet maintenant)

2voto

James Thompson Points 15464

En Python et dans de nombreux autres langages de programmation, les parenthèses ne sont pas nécessaires pour chaque expression comportant plusieurs opérateurs. Cela est dû au fait que les opérateurs ont une préséance définie. Voir le tableau aquí (Section 5.15) pour des informations sur la précédence 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, alors vous devez utiliser les parenthèses comme ceci :

5 * (5 + 3)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X