Est-il possible de déclarer plusieurs variables à l'aide d'une with
instruction en Python?
Quelque chose comme:
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)
... ou nettoyer deux ressources en même temps est-il le problème?
python
with-statement
poisson-globe
la source
la source
Réponses:
C'est possible dans Python 3 depuis la v3.1 et Python 2.7 . La nouvelle
with
syntaxe prend en charge plusieurs gestionnaires de contexte:Contrairement à la
contextlib.nested
, cela garantit quea
etb
aura leur__exit__()
appelé même siC()
la__enter__()
méthode ou lève une exception.Vous pouvez également utiliser des variables antérieures dans des définitions ultérieures (h / t Ahmad ci-dessous):
la source
with open('./file') as arg.x = file:
?as
est facultatif.as
est requis si vous avez besoin de l'objeta
oub
, mais le toutas a
ouas b
n'est pas requiscontextlib.nested
soutient ceci:Mise à jour:
Pour citer la documentation, concernant
contextlib.nested
:Voir la réponse de Rafał Dowgird pour plus d'informations.
la source
nested
gestionnaire de contexte est une erreur et ne doit jamais être utilisé. Dans cet exemple, si l'ouverture du deuxième fichier déclenche une exception, le premier fichier ne sera pas fermé du tout, détruisant ainsi totalement l'utilisation des gestionnaires de contexte.with
blocs imbriqués standard . Les gestionnaires sont créés dans l'ordre avant d' entrer dans les blocs avec: m1, m2, m3 = A (), B (), C () Si B () ou C () échoue à l'exception, alors votre seul espoir de finaliser correctement A ( ) est le garbage collector.Notez que si vous divisez les variables en lignes, vous devez utiliser des barres obliques inversées pour encapsuler les nouvelles lignes.
Les parenthèses ne fonctionnent pas, car Python crée à la place un tuple.
Comme les tuples n'ont pas d'
__enter__
attribut, vous obtenez une erreur (non descriptive et n'identifie pas le type de classe):Si vous essayez d'utiliser
as
entre parenthèses, Python détecte l'erreur au moment de l'analyse:https://bugs.python.org/issue12782 semble être lié à ce problème.
la source
Je pense que vous voulez le faire à la place:
la source
Depuis Python 3.3, vous pouvez utiliser la classe
ExitStack
ducontextlib
module.Il peut gérer un nombre dynamique d'objets contextuels, ce qui signifie qu'il s'avérera particulièrement utile si vous ne savez pas combien de fichiers vous allez gérer.
Le cas d'utilisation canonique mentionné dans la documentation gère un nombre dynamique de fichiers.
Voici un exemple générique:
Production:
la source
Dans Python 3.1+, vous pouvez spécifier plusieurs expressions de contexte, et elles seront traitées comme si plusieurs
with
instructions étaient imbriquées:est équivalent à
Cela signifie également que vous pouvez utiliser l'alias de la première expression dans la seconde (utile lorsque vous travaillez avec des connexions / curseurs db):
la source