web-dev-qa-db-fra.com

Python gestionnaire de contexte imbriqué sur plusieurs lignes

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
26
Simon Boudrias

Caractères de barre oblique inverse

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)

Imbrication

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 )

24
vaultah

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.

8
9000
with context1 as a, \
context2 as b:
pass

Comme tout saut de ligne, la barre oblique inversée fournit la solution

2
Sudeep Juvekar

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

2
Robᵩ