Плюсы и минусы использования 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 указатель) стек.