Come posso eseguire in modo condizionale il codice in un blocco "con"?
-
05-07-2019 - |
Domanda
Immagino che questo stia abusando della funzione, ma sono ancora curioso di sapere se potrebbe essere fatto - Voglio fare qualcosa del tipo:
with conditional(a):
print 1
in modo che la parte print 1
sia eseguita solo se a == True.
È possibile?
EDIT: Come le persone dichiarano di seguito, questo è uno stile orribile. È solo un indovinello \ domanda. Non provarlo a casa, non per i deboli di cuore ecc.
Soluzione
Non c'è alcun motivo reale per farlo, poiché i condizionali sono già forniti usando l'istruzione if
:
if a == True:
print 1
Ma, se stai solo chiedendo divertimento , la risposta è non puoi davvero. Per interrompere l'esecuzione del con
, condizionale
dovrà in qualche modo interrompere l'esecuzione, nel suo metodo __enter__
. Ma l'unico modo in cui può farlo è sollevare un'eccezione, il che significa che non verrà eseguito nessun altro codice, a meno che non si impacchi il con
con un'istruzione try
per la gestione dei casi a! = True
Modifica: visto che sono stato perseguito nei commenti e nei voti per l'utilizzo della condizione del PO ( a == True
) ho considerato di cambiarlo in se un
, che è ovviamente il linguaggio in Python per testare i condizionali. Ma non sappiamo che cosa aveva in mente l'OP e se vuole davvero che a
sia un valore booleano e non vogliamo che il blocco venga eseguito se a = [1]
(che passerà se un
) ho deciso di lasciarlo così com'è.
Altri suggerimenti
if a is True:
print 1
with
statement è destinato a fornire un contesto di entrata-uscita affidabile.
L'unico modo per vedere è sollevare un'eccezione in condizionale
se il suo argomento è falso. Il corpo with
non verrà eseguito, ma nessuno dei codici che seguono - fino a quando una clausola tranne
o infine
, ovviamente.
Diciamo che ho una classe A con una funzione __enter__ e __exit__:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
E una funzione B che controllerà se b nell'oggetto c è uguale a 1 altrimenti passerà.
def b(c):
if c.b == 1:
return c
else:
pass
Posso ottenere:
with b(A(1)):
print 10
enter
10
exit
Ma genererà un AttributeError se b passa come con non avrà nulla con cui lavorare.
Una soluzione sarebbe quella di inserire con b (A (1)):
all'interno di un blocco try / tranne. Ma non consiglio di farlo.