¿Cómo puedo ejecutar condicionalmente el código en un & # 8220; con & # 8221; ¿bloquear?

StackOverflow https://stackoverflow.com/questions/1808675

  •  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.

¿Fue útil?

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 a = [1] (que pasará a 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top