Một số ví dụ là: mở tệp bằng cách sử dụng with open(filename) as fp:
, lấy khóa bằng cách sử dụng with lock:
( lock
ví dụ là trường hợp threading.Lock
). Bạn cũng có thể xây dựng các trình quản lý bối cảnh của riêng mình bằng cách sử dụng trình contextmanager
trang trí từ contextlib
. Chẳng hạn, tôi thường sử dụng cái này khi tôi phải thay đổi thư mục hiện tại tạm thời và sau đó quay lại nơi tôi đang ở:
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
Dưới đây là một ví dụ khác mà tạm thời chuyển hướng sys.stdin
, sys.stdout
và sys.stderr
một số xử lý tập tin khác và khôi phục chúng sau:
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"
Và cuối cùng, một ví dụ khác tạo thư mục tạm thời và dọn sạch nó khi rời khỏi bối cảnh:
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
with
trong tài liệu Python 3.