significa - simbolos en python
Cómo salir de una cláusula if (9)
¿Qué tipo de métodos existen para salir prematuramente de una cláusula if
?
Hay momentos en los que escribo código y quiero poner una declaración break
dentro de una cláusula if
, solo para recordar que esos solo se pueden usar para bucles.
Tomemos el siguiente código como ejemplo:
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
Puedo pensar en una forma de hacer esto: suponiendo que los casos de salida suceden dentro de sentencias if anidadas, ajuste el código restante en un gran bloque else. Ejemplo:
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
El problema con esto es que más ubicaciones de salida significan más código de anidamiento / sangría.
Alternativamente, podría escribir mi código para que las cláusulas if
sean lo más pequeñas posibles y no requiera ninguna salida.
¿Alguien sabe de una buena / mejor manera de salir de una cláusula if
?
Si hay alguna cláusula else-if y else asociada, supongo que al salir se saltearían sobre ellas.
¿tal vez esto?
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
(Este método funciona para s, múltiples bucles anidados y otras construcciones de las que no se puede break
fácilmente).
Envuelva el código en su propia función. En lugar de break
, usa return
.
Ejemplo:
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()
...
Así que aquí entiendo que estás tratando de salir del bloque de código externo si
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
Una forma de salir de esto es que puede probar una condición falsa en el bloque exterior if, que luego saldrá implícitamente del bloque de código, luego usará un bloque else para anidar los otros ifs para hacer algo
if test_for_false:
# Exit the code(which is the outer if code)
else:
if condition_a:
# Do something
if condition_b:
# Do something
Efectivamente, lo que estás describiendo son declaraciones goto, que generalmente se critican bastante. Tu segundo ejemplo es mucho más fácil de entender.
Sin embargo, aún más limpio sería:
if some_condition:
...
if condition_a:
your_function1()
else:
your_function2()
...
def your_function2():
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
En términos generales, no lo hagas. Si está anidando "ifs" y rompiendo con ellos, lo está haciendo mal.
Sin embargo, si debe:
if condition_a:
def condition_a_fun():
do_stuff()
if we_wanna_escape:
return
condition_a_fun()
if condition_b:
def condition_b_fun():
do_more_stuff()
if we_wanna_get_out_again:
return
condition_b_fun()
Tenga en cuenta que las funciones NO TIENEN que declararse en la instrucción if, pueden declararse de antemano;) Esta sería una mejor opción, ya que evitará la necesidad de refactorizar un feo si / luego más adelante.
Para lo que realmente se preguntó, mi enfoque es poner esos if
dentro de un bucle de un solo bucle
while (True):
if (some_condition):
...
if (condition_a):
# do something
# and then exit the outer if block
break
...
if (condition_b):
# do something
# and then exit the outer if block
break
# more code here
# make sure it is looped once
break
Pruébalo:
conditions = [True,False]
some_condition = True
for condition_a in conditions:
for condition_b in conditions:
print("/n")
print("with condition_a", condition_a)
print("with condition_b", condition_b)
while (True):
if (some_condition):
print("checkpoint 1")
if (condition_a):
# do something
# and then exit the outer if block
print("checkpoint 2")
break
print ("checkpoint 3")
if (condition_b):
# do something
# and then exit the outer if block
print("checkpoint 4")
break
print ("checkpoint 5")
# more code here
# make sure it is looped once
break
Puede emular la funcionalidad de goto con excepciones:
try:
# blah, blah ...
# raise MyFunkyException as soon as you want out
except MyFunkyException:
pass
Descargo de responsabilidad: solo quiero llamar su atención sobre la posibilidad de hacer las cosas de esta manera, mientras que de ninguna manera lo respaldo como razonable en circunstancias normales. Como mencioné en un comentario sobre la pregunta, es preferible, con mucho, el código de estructuración para evitar los condicionales bizantinos. :-)
from 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
(No use esto, por favor)
while some_condition:
...
if condition_a:
# do something
break
...
if condition_b:
# do something
break
# more code here
break