SORU
10 HAZİRAN 2010, PERŞEMBE


Python "ile" deyimi için tasarlanan nedir?

Bugün ilk defa with Python deyimi ile karşılaştım. Hafifçe Python birkaç aydır kullanıyorum ve varlığını bile bilmiyordu! Biraz belirsiz bu durumda sormaya değer olacağını düşündüm:

  1. with Python deyimi nedir olmak için kullanılır? tasarlanmış
  2. Ne bunun için mi kullanıyorsunuz?
  3. Onların herhangi bir farkında olmak lazım, ya da sorunlar ortak anti-desen ile ilişkili nasıl kullanılıyor? Daha iyi kullanın. with try..finally olduğu bir dava var mı?
  4. Neden daha yaygın olarak kullanılan değil mi?
  5. Standart kütüphane sınıfları ile uyumlu mu?

CEVAP
10 HAZİRAN 2010, PERŞEMBE


  1. İnanıyorum ki bu zaten cevap diğer kullanıcıların önce bana, bu yüzden ben sadece eklemek için hatırı bütünlüğü: with deyimi kolaylaştırır istisna yönetimi tarafından şifrelenmiş ortak hazırlık ve temizlik işleri içinde sözde context managers. Daha fazla bilgi PEP 343 bulunabilir. Örneğin, open ifadesi bir içerik yöneticisi kendisi, hangi sağlar bir dosya açın, açık kalsın sürece infaz bağlamında with deyimi nerede kullanılır, ve yakın zamana kadar? bırakın bu bağlamda, ister zorunda kaldı, çünkü bir özel durum sırasında veya normal denetim akışı. with deyimi böylece kullanılabilecek yollar benzer RAII pattern C : Bazı kaynak elde ederek with ifade ve serbest zaman bırakmak with bağlam.

  2. Bazı örnekler: dosya açma with open(filename) as fp: kilitler with lock: lock threading.Lock bir örneği olduğu) kullanarak elde kullanma. Ayrıca kendi içerik yöneticileri contextlib contextmanager dekoratör kullanarak inşa edebilirsiniz. Örneğin, sık sık geçerli dizini geçici olarak değiştirmek ve olduğum yere dönmek için bunu kullanın:

    from contextlib import contextmanager
    import os
    
    
    @contextmanager
    def working_directory(path):
        current_dir = os.getcwd()
        os.chdir(path)
        try:
            yield
        finally:
            os.chdir(current_dir)
    
    
    with working_directory("data/stuff"):
        # do something within data/stuff
    # here I am back again in the original working directory
    

    Burada geçici olarak başka bir dosya işlemek için sys.stdin, sys.stdout sys.stderr yönlendirmeler ve daha sonra onları geri başka bir örnek:

    from contextlib import contextmanager
    import sys
    
    
    @contextmanager
    def redirected(**kwds):
        stream_names = ["stdin", "stdout", "stderr"]
        old_streams = {}
        try:
            for sname in stream_names:
                stream = kwds.get(sname, None)
                if stream is not None and stream != getattr(sys, sname):
                    old_streams[sname] = getattr(sys, sname)
                    setattr(sys, sname, stream)
            yield
        finally:
            for sname, stream in old_streams.iteritems():
                setattr(sys, sname, stream)
    
    
    with redirected(stdout=open("/tmp/log.txt", "w")):
         # these print statements will go to /tmp/log.txt
         print "Test entry 1"
         print "Test entry 2"
    # back to the normal stdout
    print "Back to normal stdout again"
    

    Ve son olarak, geçici bir klasör oluşturur ve bağlamında çıkarken temizler başka bir örnek:

    from tempfile import mkdtemp
    from shutil import rmtree
    
    
    @contextmanager
    def temporary_dir(*args, **kwds):
        name = mkdtemp(*args, **kwds)
        try:
            yield name
        finally:
            shutil.rmtree(name)
    
    
    with temporary_dir() as dirname:
        # do whatever you want
    

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008