我明白why contextlib.nested is deprecated。解決方法怪癖在contextlib.nested
但是,如果我編寫一箇舊的Python版本的W/O與多種形式(即,< 2.7)的程序,我(幾乎)沒有其他選擇。
爲了避免下面的結構失敗:
with nested(open("f1"), open("f2")) as (f1, f2):
(f1
如果開放f2
失敗不會關,因爲沒有進入contextmanager)
我能想象寫上下文管理器,它初始化移動到其__enter__
:
@contextmanager
def late_init(f, *a, **k):
r = f(*a, **k)
with r as c: yield c
我說得對不對THI nking是
with nested(late_init(open, "f1"), late_init(open, "f2")) as (f1, f2):
將在這裏足以讓 「乾淨」?
給出的用例僅僅是一個例子。想象一下,你有一個文件的列表,其長度不會過早知道。然後既不2.7組成with
是可用的,也不符合幾個縮進with
語句預2.7嵌套方式。
我可能必須對此更詳細。
上述worharound乍一看解決了問題:調用函數在一個安全的地方執行,以便可以檢測到故障並進行適當處理。
我的問題是:它是否治癒的缺陷,還是我讓其他的問題?
是的,我已經說過了。但是這個答案並沒有真正回答我的問題。想象一下,我沒有2個文件,但5或10或者我有一個可變長度文件的列表/元組。在這種情況下,您的解決方案並不可行。 – glglgl 2012-03-25 13:35:10