Von Lernpython:
Das Grundformat der with-Anweisung sieht so aus, mit einem optionaler Teil in eckigen Klammern hier:
%Vor%Hier wird angenommen, dass
expression
ein Objekt zurückgibt, das das Objekt unterstützt Kontext-Management-Protokoll (mehr zu diesem Protokoll in einem Moment). Dieses Objekt kann auch einen Wert zurückgeben, der dem Namenvariable
zugewiesen wird, wenn die optionale as-Klausel vorhanden ist.Beachten Sie, dass dem
variable
nicht unbedingt das Ergebnis von zugewiesen wird dieexpression
; Das Ergebnis vonexpression
ist das Objekt, das unterstützt das Kontextprotokoll und dasvariable
kann zugewiesen werden etwas anderes soll in der Aussage verwendet werden.
expression
wird für ein Kontextmanagerobjekt ausgewertet.
Was ist variable
zugewiesen? Das Zitat sagt nur, dass es kein Kontextmanagerobjekt ist.
Ruft die Zuweisung zu variable
eine Methode einer Kontextmanagerklasse auf, um den tatsächlichen Wert zu erzeugen, der variable
zugeordnet ist?
Danke.
Was von __enter__
zurückgegeben wird. In der Dokumentation zur Methode __enter__
von Kontextmanagern :
contextmanager.__enter__()
Geben Sie den Laufzeitkontext ein und geben Sie entweder dieses Objekt oder ein anderes Objekt zurück, das sich auf den Laufzeitkontext bezieht. Der von dieser Methode zurückgegebene Wert ist an den Bezeichner in der
as
-Klausel vonwith
-Anweisungen gebunden, die diesen Kontextmanager verwenden.
(Betonung meiner)
Das Ergebnis des Aufrufs von __enter__
könnte sehr gut ein Kontextmanager sein, nichts in der Spezifikation verbietet dies. Es könnte natürlich ein anderes Objekt sein, das mit dem Laufzeitkontext in Zusammenhang steht, wie der Dokumentstatus angibt.
Objekte, die sich selbst von __enter__
zurückgeben, können immer wieder als Kontextmanager verwendet werden. file
Objekte , zum Beispiel:
Nicht, dass das vorherige viel Sinn ergeben hätte, nur um den Punkt klar zu machen.
Ihr Objekt kann als Kontextmanager fungieren, wenn es beide __enter__
bereitstellt. und __exit__
. Das von __enter__
zurückgegebene Objekt ist an das Objekt gebunden, das Sie im as
-Teil der with
-Anweisung angeben:
Tags und Links python python-3.x