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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top