SORU
11 HAZİRAN 2010, Cuma


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
11 HAZİRAN 2010, Cuma


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,.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009
  • TopDJMag TV

    TopDJMag TV

    29 Temmuz 2010