Wie kann ich bedingt Code in einem „mit“ Block ausführen?
-
05-07-2019 - |
Frage
Ich denke, das irgendwie ist die Funktion missbrauchen, aber ich bin immer noch neugierig, ob es getan werden könnte - Ich möchte so etwas wie:
with conditional(a):
print 1
, so dass der print 1
Teil nur dann, wenn ein == true ausgeführt.
Ist das möglich?
EDIT: Wie die Menschen unten angeben, ist diese schreckliche Art. Es ist nur ein Rätsel \ Frage. Tun Sie dies nicht versuchen, zu Hause, nicht für schwache Nerven etc.
Lösung
Es gibt keinen wirklichen Grund, das zu tun, da conditionals bereits die if
Anweisung geliefert wird mit:
if a == True:
print 1
Aber, wenn Sie nur für Spaß zu fragen ist die Antwort Sie können nicht wirklich. Um den with
Inhalt von der Ausführung zu stoppen, conditional
müssen irgendwie die Ausführung zu stoppen, in seiner __enter__
Methode. Aber der einzige Weg, um es tun können, eine Ausnahme erzieht, die kein anderes Codemittel laufen, wenn Sie die with
mit einer try
Anweisung wickeln für Fälle a != True
Handhabung
Edit: da ich in den Kommentaren und Stimmen für die Verwendung der OP Zustandes (a == True
) verfolgt wurde ich hielt Ändern es if a
, die zum Testen conditionals das Idiom in Python natürlich ist. Aber wir nicht wissen, , was die OP im Sinne hatte, und ob er wirklich a
will einen boolean sein, und will nicht Block auszuführen, wenn a = [1]
(die if a
passieren) I < strong> beschlossen, es zu lassen wie es ist.
Andere Tipps
if a is True:
print 1
with
Anweisung soll ein zuverlässiger bereitzustellen eingeben -exit Kontext.
Der einzige Weg, ich sehe, ist eine Ausnahme in conditional
zu erhöhen, wenn ihr Argument falsch ist. Der with
Körper wird nicht ausgeführt, aber noch wird eine des Code, der folgt -., Bis eine except
oder finally
Klausel, natürlich
Lassen Sie uns sagen, dass ich Klasse A mit einem __enter__ haben und eine __exit__ Funktion:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
Und eine Funktion B, die in Objekt c 1 sonst, wenn b gleich prüft es wird vorübergehen.
def b(c):
if c.b == 1:
return c
else:
pass
Ich kann erreicht werden:
with b(A(1)):
print 10
enter
10
exit
Aber es wird ein Attribut wenn b geht als mit wird nichts, mit zu arbeiten werfen.
Eine Lösung wäre es, die with b(A(1)):
in einem Versuch zu setzen / außer Block. Aber ich weiß nicht empfehlen dies zu tun.