2011-10-12 19 views
17

me gusta la comodidad de la declaración múltiple contexto with en Python 2.7:contexto múltiple `with` declaración en Python 2.6

with open('a.txt') as a, open('b.txt') as b: 
    do_many_amazing_things(a, b) 

Sin embargo, tengo que mantener la compatibilidad con 2.6.

with se llevó a 2.5 a través de __future__, pero no puedo encontrar nada acerca de la versión de contexto múltiple que se retrotrae a 2.6 en la documentación.

¿Hay algo que había perdido?

EDIT: Soy consciente de que es posible nido with declaraciones. Me pregunto si es posible usar múltiples con declaraciones.

+0

estoy realmente sorprendido de que se añadió esta característica a Python - el principio rector siempre ha sido hacer las cosas simple y obvia, pero desde la anidación 'declaraciones with' es tan natural ... –

+2

se pone feo, si está haciendo más de 2. –

Respuesta

20

Si no es posible un equivalente retrocompatible de esto, lo manejaría haciendo que la declaración with de contextos múltiples sea un conjunto de sentencias with de contexto único anidadas.

with open('a.txt') as a: 
    with open('b.txt') as b: 
     do_many_amazing_things(a, b) 

EDITAR para hacer frente a tu edición:

Si insiste en no anidan with declaraciones adicionales, siempre se puede utilizar contextlib

import contextlib 
with contextlib.nested(open("a.txt"), open("b.txt")) as (a, b): 
    do_many_amazing_things(a,b) 

cuanto al uso de múltiples with declaraciones del futuro-importado with, esto no es posible, por lo que yo sé

+0

voluntad no la solución contextlib fallar si se abre el primer archivo pero no el segundo, ¿el primer archivo no se cerrará? –

+0

@ Marcos aleatoria Creo que sí, que debería haber mencionado que, pero es lo más cercano que puedo encontrar a las intenciones de Austin – jsvk

+0

No veo por qué se dice que el primer archivo no se cerrará. Si escribirlo de una manera es el mismo que el otro, entonces el primer archivo se cerrará sin importar cómo salió el flujo de ejecución del primer contexto. – Gabriel