147 votes

Comment sortir d'une clause if

Quelles sont les méthodes permettant de sortir prématurément d'une if clause ?

Il m'arrive parfois d'écrire du code et de vouloir mettre un break à l'intérieur d'une déclaration if pour se rappeler qu'elles ne peuvent être utilisées que pour les boucles.

Prenons l'exemple du code suivant :

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   ...
   if condition_b:
       # do something
       # and then exit the outer if block
   # more code here

Je pense à un moyen de le faire : en supposant que les cas de sortie se produisent à l'intérieur d'instructions if imbriquées, envelopper le code restant dans un gros bloc else. Exemple :

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   else:
       ...
       if condition_b:
           # do something
           # and then exit the outer if block
       else:
           # more code here

Le problème est qu'un plus grand nombre d'emplacements de sortie signifie plus de code imbriqué/indenté.

Je pourrais également écrire mon code de manière à ce que la fonction if les clauses doivent être aussi réduites que possible et ne pas nécessiter d'issues.

Quelqu'un connaît-il une bonne/meilleure façon de sortir d'une if clause ?

S'il existe des clauses "else-if" et "else" associées, je suppose que la sortie les ignore.

144voto

Drew Dormann Points 25025

Cette méthode fonctionne pour if s, des boucles multiples imbriquées et d'autres constructions qu'il n'est pas possible d'utiliser. break facilement.

  1. Enveloppez le code dans sa propre fonction.
  2. Au lieu de break , utiliser return .

Exemple :

def some_function():
    if condition_a:
        # do something and return early
        ...
        return
    ...
    if condition_b:
        # do something else and return early
        ...
        return
    ...
    return

if outer_condition:
    ...
    some_function()
    ...

81voto

ephemient Points 87003
from [goto](http://entrian.com/goto/) import goto, label

if some\_condition:
   ...
   if condition\_a:
       # do something
       # and then exit the outer if block
       goto .end
   ...
   if condition\_b:
       # do something
       # and then exit the outer if block
       goto .end
   # more code here

label .end

(Ne l'utilisez pas, s'il vous plaît.)

36voto

Thomas Eding Points 8651
while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break

13voto

Michał Marczyk Points 54179

Vous pouvez émuler la fonctionnalité de goto avec des exceptions :

try:
    # blah, blah ...
    # raise MyFunkyException as soon as you want out
except MyFunkyException:
    pass

Clause de non-responsabilité : mon intention est uniquement d'attirer votre attention sur les possibilité de faire les choses de cette manière, mais en aucun cas je ne la considère comme raisonnable dans des circonstances normales. Comme je l'ai mentionné dans un commentaire sur la question, il est de loin préférable de structurer le code de manière à éviter les conditionnelles byzantines :-)

12voto

ghostdog74 Points 86060

Peut-être est-ce le cas ?

if some_condition and condition_a:
       # do something
elif some_condition and condition_b:
           # do something
           # and then exit the outer if block
elif some_condition and not condition_b:
           # more code here
else:
     #blah
if

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