¿Es posible declarar más de una variable usando una withdeclaració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
withsintaxis admite múltiples administradores de contexto:A diferencia de la
contextlib.nested, esto garantiza queaybtendrá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:?ases opcional.asse requiere si necesita el objetoaob, pero no se requiere todoas aoas bnocontextlib.nestedapoya 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
nestedadministrador 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.withbloques 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
asentre 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
ExitStackdesde elcontextlibmó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
withdeclaraciones: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