python: " oluşturmak;ile" birkaç bağlam yöneticileri blokta
Üç nesne var içerik yöneticisi, örneğin üzerinden Bir kilit, db bağlantısı ve bir ıp soket elde varsayalım. Onları elde edebilirsiniz:
with lock:
with db_con:
with socket:
#do stuff
Ama bir şekilde bir blok içinde bir ilgisi var mı? gibi bir şey
with lock,db_con,socket:
#do stuff
Ayrıca, mümkün, içerik yöneticileri var olan nesnelerin bilinmeyen uzunlukta bir dizi göz önüne alındığında, olası bir şekilde yapmak
a=[lock1, lock2, lock3, db_con1, socket, db_con2]
with a as res:
#now all objects in array are acquired
Eğer cevap", çünkü böyle bir özellik gerek kötü tasarım anlamına gelir, ya da belki bir moral içinde desem?" yok ise :-P
CEVAP
Python 2.6 ve aşağıdayapabilirsiniz contextlib.nested
kullanın:
from contextlib import nested
with nested(A(), B(), C()) as (X, Y, Z):
do_something()
eşittir:
m1, m2, m3 = A(), B(), C()
with m1 as X:
with m2 as Y:
with m3 as Z:
do_something()
Not bu değil tam olarak aynı normal olarak kullanarak iç içe with
çünkü A()
, B()
C()
tüm denilmek başlangıçta, önce girme bağlamında yöneticileri. Bu ise, bu işlevlerin bir istisna yükseltmek olabilir eğer düzgün çalışmaz, ama söz konusu örnekler için çalışacak.
Python 2.7 ve 3.1bunun için eklenmiş sözdizimi vardır, ve contextlib.nested
onaylanmaz:
with A() as X, B() as Y, C() as Z:
do_something()
Python 3.3ayrıca içeriği bilinmeyen uzunlukta bir liste girebilirsiniz. contextlib.ExitStack kullanarak: yöneticileri
with ExitStack() as stack:
for mgr in ctx_managers:
stack.enter_context(mgr)
# ...
Bu eklemeden olarak bağlam yöneticileri oluşturmanızı sağlar contextlib.nested
ile olası sorunu engeller ExitStack
,.
&; Az Şaşkınlık " " Python: Değiş...
's "araçlar:bağlam" And...
Ne "Lale" adında; Python?...
Nasıl değişmez bir " baskı miyim;{}&qu...
Ne istekleri' &; F5" quot; ve...