¿Cómo puedo ejecutar condicionalmente el código en un & # 8220; con & # 8221; ¿bloquear?
-
05-07-2019 - |
Pregunta
Supongo que esto es un poco abusivo de la función, pero sigo sintiendo curiosidad por si se puede hacer, Quiero hacer algo como:
with conditional(a):
print 1
para que la parte print 1
se ejecute solo si a == Verdadero.
¿Es esto posible?
EDITAR: Como dice la gente a continuación, este es un estilo horrible. Es sólo una pregunta de adivinanzas. No intentes esto en casa, no para los débiles de corazón, etc.
Solución
No hay ninguna razón real para hacerlo, ya que los condicionales ya se suministran con la declaración if
:
if a == True:
print 1
Pero, si solo estás pidiendo diversión , la respuesta es que no puedes realmente. Para detener la ejecución del with
, conditional
deberá detener la ejecución de alguna manera, en su método __enter__
. Pero la única forma en que puede hacerlo es al generar una excepción, lo que significa que no se ejecutará ningún otro código, a menos que envuelva el with
con una declaración de try
para manejar los casos a! = True
Editar: al ver que fui procesado por los comentarios y votos por el uso de la condición del OP ( a == True
) consideré cambiarlo a si es
, que es por supuesto el idioma en Python para probar condicionales. Pero, no sabemos lo que tenía en mente el OP, y si realmente quiere que a
sea un booleano, y no quiere que se ejecute el bloqueo si si a
) Yo decidí dejarlo como está.
Otros consejos
if a is True:
print 1
con
declaración está pensado para proporcionar un contexto de entrada-salida confiable.
La única manera que veo es plantear una excepción en condicional
si su argumento es falso. El cuerpo de with
no se ejecutará, pero ninguno de los códigos siguientes: hasta una excepto
o finally
, por supuesto.
Digamos que tengo clase A con un __enter__ y un __exit__ función:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
Y una función B que verificará si b en el objeto c es igual a 1, de lo contrario pasará.
def b(c):
if c.b == 1:
return c
else:
pass
Puedo lograr:
with b(A(1)):
print 10
enter
10
exit
Pero lanzará un AttributeError si b pasa, ya que with no tendrá nada con qué trabajar.
Una solución sería colocar el con b (A (1)):
dentro de un bloque try / except. Pero no recomiendo hacer esto.