Плюсы и минусы использования return (yield from some_function())

Я часто вижу код, подобный следующему (что похоже на примеры в документах aiohttp).

@asyncio.coroutine
def init(loop):
    srv = yield from loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080)
    return srv

Есть ли какие-либо преимущества / недостатки в выполнении одной строки, как показано ниже, при условии, что вы не хотите ничего делать с srv объект между получением и возвратом?

@asyncio.coroutine
def init(loop):
    return (yield from loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080))

1 ответ

Решение

Пример в документах aiohttp, которые вы, кажется, адаптировали, содержит важный дополнительный код:

@asyncio.coroutine
def init(loop):
    app = web.Application(loop=loop)
    app.router.add_route('GET', '/{name}', handle)

    srv = yield from loop.create_server(app.make_handler(),
                                        '127.0.0.1', 8080)
    print("Server started at http://127.0.0.1:8080")  # THIS PART
    return srv

Функция должна делать что-то между yield from и return, поэтому он должен сохранить возвращаемое значение в переменную. Если нет необходимости делать что-то между доходностью и доходностью, это действительно эквивалентно

return (yield from whatever)

вместо

srv = yield from whatever
return srv

и вы можете увидеть, что сделано в других примерах на той же странице:

@asyncio.coroutine
def fetch_page(url):
    response = yield from aiohttp.request('GET', url)
    assert response.status == 200
    return (yield from response.read())

Для такого простого примера, как ваш код, я не думаю, что вам даже нужно yield from, Вы должны быть в состоянии сделать

@asyncio.coroutine
def init(loop):
    return loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080)

хотя я не знаком с Asyncio, поэтому я не совсем уверен, что это не будет странно взаимодействовать с asyncio.coroutine декоратор.

Согласно принятому лучшему ответу из этого поста, в Python нет хвостового вызова, поэтому единственное реальное отличие состоит в том, что у вас будет немного больший (на 1 указатель) стек.

Другие вопросы по тегам