为什么在生成器函数中调用clearup代码?

时间:2011-05-03 14:04:32

标签: python frameworks wsgi web.py

人。我正在阅读web.py源代码,以了解WSGI框架是如何工作的。

在阅读application.py模块时,我想知道为什么在清理中调用self._cleanup这是一个生成器函数。

我搜索了使用生成器的原因,比如this,但我不确定为什么在这里使用生成器。

以下是代码块:

def wsgi(env, start_resp):
    # clear threadlocal to avoid inteference of previous requests
    self._cleanup()

    self.load(env)
    try:
        # allow uppercase methods only
        if web.ctx.method.upper() != web.ctx.method:
            raise web.nomethod()

        result = self.handle_with_processors()
        if is_generator(result):
            result = peep(result)
        else:
            result = [result]
    except web.HTTPError, e:
        result = [e.data]

    result = web.utf8(iter(result))

    status, headers = web.ctx.status, web.ctx.headers
    start_resp(status, headers)

    def cleanup():
        self._cleanup()
        yield '' # force this function to be a generator

    return itertools.chain(result, cleanup())

1 个答案:

答案 0 :(得分:1)

itertools.chain(result, cleanup())的作用是有效的

def wsgi(env, start_resp):
    [...]

    status, headers = web.ctx.status, web.ctx.headers
    start_resp(status, headers)

    for part in result:
         yield part
    self._cleanup()
    # yield '' # you'd skip this line because it's pointless

我能想象为什么它以这种奇怪的方式编写的唯一原因是为了一点点的性能而避免使用额外的纯Python循环。