Зачем вызывать код очистки в функции генератора? - PullRequest
0 голосов
/ 03 мая 2011

ребята.Я читаю исходный код web.py, чтобы понять, как работают WSGI-фреймворки.

При чтении модуля application.py мне интересно, зачем вызывать self._cleanup в 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 Ответ

1 голос
/ 03 мая 2011

То, что делает 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 для небольшой производительности.*

...