890 votes

Style Python: conditions de plusieurs lignes dans les IF

Parfois, je casse de longues conditions dans les FI à plusieurs lignes. La manière la plus évidente de faire ceci est:

   if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something
 

N'est pas très attrayant visuellement, car l'action se confond avec les conditions. Cependant, c'est la façon naturelle d'utiliser l'indentation Python correcte de 4 espaces.

Editer :

Au fait, pour l'instant j'utilise:

   if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something
 

Pas très jolie, je sais :-)

Pouvez-vous recommander une alternative?

1003voto

Harley Holcombe Points 34618

Vous n'avez pas besoin d'utiliser 4 espaces sur votre deuxième conditionnelle ligne. Peut-être utiliser:

if (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

Aussi, n'oubliez pas l'espace est plus flexible que vous ne le pensez:

if (   
       cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

Les deux sont assez laid.

Peut-être perdre de l'entre crochets (le Guide de Style décourage bien)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

Ce qui vous donne une certaine différenciation.

Ou encore:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

Je pense que je préfère:

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

Voici le Guide de Style, qui (depuis 2010) recommande l'utilisation de supports.

150voto

S.Lott Points 207588

J'ai recouru à ce qui suit dans le cas dégénéré où c'est simplement AND ou OR.

 if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):
 

Il rase quelques caractères et précise qu'il n'y a pas de subtilité à la condition.

67voto

Kevin Little Points 5406

Quelqu'un doit défendre l' utilisation des espaces verticaux ici! :)

 if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()
 

Cela rend chaque condition clairement visible. Il permet également l'expression plus propre de conditions plus complexes:

 if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()
 

Oui, nous échangeons un peu de l'immobilier vertical pour plus de clarté. Cela en vaut la peine IMO.

28voto

krawyoti Points 4533

Voici mon point de vue personnel: long les conditions sont, à mon avis, une odeur de code qui suggère refactoring dans un booléen retour de fonction/méthode, quelque chose comme:

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

Maintenant, si j'ai trouvé un moyen de faire du multi-ligne conditions à l'air bon, je vais probablement me retrouver le contenu avec eux et passer le refactoring.

D'autre part, de les avoir perturber mon sens de l'esthétique agit comme une incitation à la refactorisation.

Ma conclusion est donc que plusieurs conditions doivent moche, de manière à avoir une incitation à les éviter.

20voto

DzinX Points 13452

Je suggère de déplacer le mot-clé and à la deuxième ligne et de mettre en retrait toutes les lignes contenant des conditions avec deux espaces au lieu de quatre:

 if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something
 

C'est exactement comme ça que je résous ce problème dans mon code. Avoir un mot-clé comme premier mot dans la ligne rend la condition beaucoup plus lisible, et la réduction du nombre d'espaces distingue davantage la condition de l'action.

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