Secondo PEP-343, una dichiarazione with
traduce dal:
with EXPR as VAR:
BLOCK
a:
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
Come si può vedere, non c'è nulla di ovvio che si può fare dalla chiamata al metodo di __enter__()
il gestore del contesto che può saltare il corpo ("BLOCK
") dell'istruzione with.
Le persone hanno fatto cose specifiche dell'implementazione di Python, come la manipolazione dello stack di chiamate all'interno di __enter__()
, in progetti come withhacks. Ricordo che Alex Martelli pubblicò un interessante con-hack su stackoverflow uno o due anni fa (non ricordo abbastanza post del post per cercare e trovarlo).
Ma la semplice risposta alla tua domanda/problema è che non puoi fare quello che stai chiedendo, saltando il corpo della frase con, senza ricorrere alla cosiddetta "magia profonda" (che non è necessariamente portatile tra python implementazioni). Con la magia profonda, potresti essere in grado di farlo, ma io consiglio solo di fare cose come un esercizio nel vedere come potrebbe essere fatto, mai in "codice di produzione".
fonte
2012-09-26 03:54:27
Ho trovato questo, ma non so come dare un senso, né come implementarlo. http://www.python.org/dev/peps/pep-0377/ Ci sono altri modi più eleganti? –
Il fatto che si tratti di un PEP (e della discussione sui cambiamenti semantici) suggerisce che non può essere implementato senza ricorrere al cambiamento del comportamento dell'interprete. – nneonneo
ossessionato dalla pulizia? :) con A(), B(): dove B's __enter__ può sollevare qualcosa mi sembra soddisfacente. – swang