使用 return 的优缺点(来自 some_function() 的收益)
Pros and cons of using 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
对象做任何事情,是否有任何 advantages/disadvantages 如下所示在 1 行中执行此操作?
@asyncio.coroutine
def init(loop):
return (yield from loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080))
您似乎已经改编的 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和return之间不需要做某事,确实相当于do
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
装饰器发生奇怪的交互。
我经常看到类似下面的代码(类似于 aiohttp 文档中的示例)。
@asyncio.coroutine
def init(loop):
srv = yield from loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080)
return srv
假设您不想在获取和返回对象之间对 srv
对象做任何事情,是否有任何 advantages/disadvantages 如下所示在 1 行中执行此操作?
@asyncio.coroutine
def init(loop):
return (yield from loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080))
您似乎已经改编的 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和return之间不需要做某事,确实相当于do
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
装饰器发生奇怪的交互。