Dans Python 2.6, nous avons utilisé pour formater notre gestionnaire de contexte imbriqué de cette façon:
with nested(
context1,
context2
) as a, b:
pass
De Python 2.7 et plus, nested
est obsolète. J'ai vu de nombreux exemples de gestionnaire de contexte multiple sur une seule ligne, mais je ne trouve pas de syntaxe permettant sur plusieurs lignes. Comment feriez-vous cela?
# That's working fine
with context1 as a, context2 as b:
pass
# But how do we make it multine?
# These are not working
with (
context1,
context2
) as a, b:
pass
with context1 as a,
context2 as b:
pass
Deux lignes physiques ou plus peuvent être jointes en lignes logiques à l'aide de barres obliques inverses (
\
)
(en citant la section jonction de ligne explicite)
Si vous souhaitez placer les gestionnaires de contexte sur différentes lignes, vous pouvez le faire fonctionner en terminant les lignes avec des barres obliques inverses:
with context1 as a,\
context2 as b:
pass
contextlib.ExitStack
contextlib.ExitStack
est un
gestionnaire de contexte conçu pour faciliter la combinaison par programmation d'autres gestionnaires de contexte et fonctions de nettoyage, en particulier ceux qui sont facultatifs ou autrement pilotés par les données d'entrée.
Il est disponible en Python 3.3 et plus récent, et permet d'entrer facilement un nombre variable de gestionnaires de contexte. Pour seulement deux gestionnaires de contexte, l'utilisation ressemble à ceci:
from contextlib import ExitStack
with ExitStack() as es:
a = es.enter_context(context1)
b = es.enter_context(context2)
Il est possible de diviser une expression de contexte en plusieurs imbriquées with
instructions:
Avec plusieurs éléments, les gestionnaires de contexte sont traités comme si plusieurs instructions with étaient imbriquées:
with A() as a, B() as b:
suite équivaut à
with A() as a: with B() as b: suite
(de ( L'instruction with )
Il existe un moyen d'utiliser de manière créative les parenthèses et d'éviter la barre oblique inverse: mettez l'expression entre parenthèses avant as
. Pas très voyant, cependant:
with (
open('/etc/passwd')) as foo, (
open('/tmp/bar')) as bar:
pass # this parses correctly
Il est facile d'imbriquer de plus en plus si nécessaire.
with context1 as a, \
context2 as b:
pass
Comme tout saut de ligne, la barre oblique inversée fournit la solution
Votre exemple équivaut à:
with context1 as a:
with context2 as b:
pass
qui a l'air sympa sur deux lignes.
Référence: https://docs.python.org/2.7/reference/compound_stmts.html#the-with-statement