621 Stimmen

Mehrere Variablen in einer 'with'-Anweisung?

Ist es möglich, mehr als eine Variable zu deklarieren, indem man eine with Anweisung in Python?

Etwa so:

from __future__ import with_statement

with open("out.txt","wt"), open("in.txt") as file_out, file_in:
    for line in file_in:
        file_out.write(line)

... oder liegt das Problem darin, zwei Ressourcen gleichzeitig zu bereinigen?

7voto

Chris_Rands Punkte 34669

Ab Python 3.10 gibt es eine neue Funktion von Eingeklammerte Kontextmanager , die eine Syntax wie die folgende erlaubt:

with (
    A() as a,
    B() as b
):
    do_something(a, b)

3voto

Eugene Yarmash Punkte 130008

In Python 3.1+ können Sie mehrere Kontextausdrücke angeben, und sie werden so verarbeitet, als ob mehrere with Anweisungen verschachtelt wurden:

with A() as a, B() as b:
    suite

ist gleichbedeutend mit

with A() as a:
    with B() as b:
        suite

Das bedeutet auch, dass Sie den Alias aus dem ersten Ausdruck im zweiten verwenden können (nützlich bei der Arbeit mit DB-Verbindungen/Cursoren):

with get_conn() as conn, conn.cursor() as cursor:
    cursor.execute(sql)

2voto

Jeyekomon Punkte 2288

Sie können auch getrennt Erstellung eines Kontextmanagers (der __init__ Methode) und die Eingabe des Kontexts (die __enter__ Methode), um die Lesbarkeit zu erhöhen. Anstatt also diesen Code zu schreiben:

with Company(name, id) as company, Person(name, age, gender) as person, Vehicle(brand) as vehicle:
    pass

können Sie diesen Code schreiben:

company = Company(name, id)
person = Person(name, age, gender)
vehicle = Vehicle(brand)

with company, person, vehicle:
    pass

Beachten Sie, dass das Erstellen des Kontextmanagers außerhalb der with Anweisung erweckt den Eindruck, dass das erzeugte Objekt auch außerhalb der Anweisung weiterverwendet werden kann. Wenn dies für Ihren Kontextmanager nicht zutrifft, kann der falsche Eindruck dem Versuch der Lesbarkeit entgegenwirken.

Le site Dokumentation sagt:

Die meisten Kontextmanager sind so geschrieben, dass sie nur einmal effektiv in einer with-Anweisung verwendet werden können. Diese Einweg-Kontextmanager müssen bei jeder Verwendung neu erstellt werden - der Versuch, sie ein zweites Mal zu verwenden, löst eine Ausnahme aus oder funktioniert nicht korrekt.

Diese allgemeine Einschränkung bedeutet, dass es im Allgemeinen ratsam ist, Kontextmanager direkt in der Kopfzeile der with-Anweisung zu erstellen, in der sie verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X