¿Es posible declarar más de una variable usando una with
declaración en Python?
Algo como:
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)
... o es limpiar dos recursos al mismo tiempo el problema?
python
with-statement
pez globo
fuente
fuente
Respuestas:
Es posible en Python 3 desde v3.1 y Python 2.7 . La nueva
with
sintaxis admite múltiples administradores de contexto:A diferencia de la
contextlib.nested
, esto garantiza quea
yb
tendrán su__exit__()
'llama incluso siC()
o no lo__enter__()
método lanza una excepción.También puede usar variables anteriores en definiciones posteriores (h / t Ahmad a continuación):
fuente
with open('./file') as arg.x = file:
?as
es opcional.as
se requiere si necesita el objetoa
ob
, pero no se requiere todoas a
oas b
nocontextlib.nested
apoya esto:Actualización:
para citar la documentación, con respecto a
contextlib.nested
:Vea la respuesta de Rafał Dowgird para más información.
fuente
nested
administrador de contexto es un error y nunca debe usarse. En este ejemplo, si abrir el segundo archivo genera una excepción, el primer archivo no se cerrará en absoluto, lo que destruirá totalmente el propósito de usar administradores de contexto.with
bloques anidados estándar . Los administradores se crean en orden antes de ingresar los bloques with: m1, m2, m3 = A (), B (), C () Si B () o C () falla con excepción, entonces su única esperanza de finalizar correctamente A ( ) es el recolector de basura.Tenga en cuenta que si divide las variables en líneas, debe usar barras invertidas para ajustar las nuevas líneas.
Los paréntesis no funcionan, ya que Python crea una tupla en su lugar.
Como las tuplas carecen de un
__enter__
atributo, obtienes un error (no descriptivo y no identifica el tipo de clase):Si intenta utilizarlo
as
entre paréntesis, Python detecta el error en el momento del análisis:https://bugs.python.org/issue12782 parece estar relacionado con este problema.
fuente
Creo que quieres hacer esto en su lugar:
fuente
Desde Python 3.3, puede usar la clase
ExitStack
desde elcontextlib
módulo.Puede administrar una cantidad dinámica de objetos sensibles al contexto, lo que significa que resultará especialmente útil si no sabe cuántos archivos va a manejar.
El caso de uso canónico que se menciona en la documentación es administrar un número dinámico de archivos.
Aquí hay un ejemplo genérico:
Salida:
fuente
En Python 3.1+ puede especificar múltiples expresiones de contexto, y se procesarán como si se anidaran varias
with
declaraciones:es equivalente a
Esto también significa que puede usar el alias de la primera expresión en la segunda (útil cuando se trabaja con conexiones / cursores db):
fuente