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:
with
Python deyimi nedir olmak için kullanılır? tasarlanmış- Ne bunun için mi kullanıyorsunuz?
- 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ı? - Neden daha yaygın olarak kullanılan değil mi?
- Standart kütüphane sınıfları ile uyumlu mu?
CEVAP
İ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ındawith
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 ederekwith
ifade ve serbest zaman bırakmakwith
bağlam.Bazı örnekler: dosya açma
with open(filename) as fp:
kilitlerwith lock:
lock
threading.Lock
bir örneği olduğu) kullanarak elde kullanma. Ayrıca kendi içerik yöneticilericontextlib
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
's "ile" deyimi JavaScr...
&Quot;python3 eşdeğer-m SimpleHTTPServ...
&Quot;kullanımı" Python iddia ned...
Nedir &; bu" için *; rvalue başvur...
Python "uzatma" bir sözlük i...