contextmanager的用法

在阅读 gevent程序员指南 时,发现一个用法:

from contextlib import contextmanager
@contextmanager
def sessionmanager(environ):
    _requests.request = Request(environ)
    yield
    _requests.request = None

这里是实现with语法的简便写法,不然我们有可能需要写一个类,它的用法是:

with sessionmanager(environ):
    body = logic()

不过我要说的是另一种也许是更好的写法,这是看到有一个关于 contextmanager 的快速演讲时看到的。因为是快速演讲,这位外国的兄弟话速真叫一个快。他建议的写法没有太大的变化,只不过是在代码块中加了try/finally,例如上面的代码改为:

from contextlib import contextmanager
@contextmanager
def sessionmanager(environ):
    try:
        _requests.request = Request(environ)
        yield
    finally:
        _requests.request = None

将需要回收或清理的代码放在finally中,保存如果执行中出错,一定可以执行清理操作。这样可能会更好一些。

你可能感兴趣的:(contextmanager的用法)