1. 程式人生 > >上下文管理器 contextlib

上下文管理器 contextlib

pytho self eat ini out spa col begin port

from contextlib import contextmanager

@contextmanager
def tag(name):
    print "<%s>" % name
    yield
    print "</%s>" % name

>>> with tag("h1"):
...    print ("foo")
...
<h1>
foo
</h1>

編寫 __enter__ 和 __exit__ 仍然很繁瑣,因此Python的標準庫 contextlib 提供了更簡單的寫法

@contextmanager 這個裝飾器接受一個 generator,用 yield 語句把 with ... as var 把變量輸出出去,然後,with 語句就可以正常的工作了

from contextlib import contextmanager
 
class Query(object):
 
    def __init__(self, name):
        self.name = name
 
    def query(self):
        print(Query info about %s... % self.name)
 
@contextmanager
def create_query(name):
    print(Begin)
    q = Query(name)
    yield q
    print(End
)
with create_query(Bob) as q:
    q.query()

上下文管理器 contextlib