2011-10-12 31 views
17

我喜歡多上下文with語句在Python 2.7的方便:多個上下文`with`語句在Python 2.6

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

不過,我需要保持與2.6的兼容性。

with通過__future__帶到2.5,但我無法找到有關在文檔中將多上下文版本移植到2.6的任何信息。

有什麼我錯過了嗎?

編輯:我知道,可以嵌套with陳述。我在問是否可以使用多個語句。

+0

我真的很驚訝,這個功能被添加到Python - 指導原則一直是爲了讓事情變得簡單明瞭,但是由於嵌套''語句是非常自然的...... –

+2

如果你做的事情超過2個,它會變得很難看。 –

回答

20

如果沒有可能的後向兼容等價物,我將通過使多語境with語句成爲一組單一上下文嵌套的with語句來處理它。

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

編輯解決您的編輯:

如果你堅持不嵌套額外with語句,你可以隨時使用contextlib

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

對於使用多從未來進口with聲明with,這是不可能的,據我所知

+0

contextlib解決方案不會失敗如果第一個文件打開但不是第二個文件 - 第一個文件不會被關閉? –

+0

@Mark隨機我相信是這樣,我應該提到這一點,但這是我能找到的最接近的東西,奧斯汀的意圖 – jsvk

+0

我不明白你爲什麼說第一個文件不會關閉。如果以一種方式寫入與另一種方式相同,則不管第一個上下文的執行流程如何,第一個文件都會關閉。 – Gabriel