Betrachten Sie das folgende Beispiel:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
Ich habe die Sprachdokumente (2.7) für With-Statement sowie PEP-343 gelesen, aber soweit ich das beurteilen kann, sagen sie nichts dazu.
In CPython f
scheint 2.6.5 außerhalb des With -Blocks definiert zu sein, aber ich möchte mich lieber nicht auf ein Implementierungsdetail verlassen, das sich ändern könnte.
Antworten:
Ja, der Kontextmanager ist außerhalb der with-Anweisung verfügbar und dies ist nicht implementierungs- oder versionabhängig. Mit Anweisungen wird kein neuer Ausführungsbereich erstellt.
quelle
die
with
Syntax:ist ungefähr Zucker für:
Dies ist oft nützlich. Beispielsweise
Der Kontextmanager kann mehrmals von Nutzen sein.
quelle
Falls
f
es sich um eine Datei handelt, wird sie außerhalb derwith
Anweisung geschlossen angezeigt.Zum Beispiel dies
würde drucken:
Sie finden die Details in PEP-0343 im Abschnitt Spezifikation: Die ' with' -Anweisung . Python-Bereichsregeln (die möglicherweise irritierend sind ) gelten
f
auch für.quelle
[x for x in [1]]
.x
ist außerhalb davon verfügbar. Machen Sie es zu einem Generator :(x for x in [1])
. Jetztx
ist nicht verfügbar. Ich erinnere mich, dass dies in Python 3 geändert wurde, so dass selbst bei Listenverständnisx
kein Leck auftreten würde, aber ich kann die Referenz jetzt nicht finden.Um Heikkis Frage in den Kommentaren zu beantworten: Ja, dieses Scoping-Verhalten ist Teil der Python-Sprachspezifikation und funktioniert für alle kompatiblen Pythons (einschließlich PyPy, Jython und IronPython).
quelle