使用return的利弊(来自some_function()的收益)

neR*_*Rok 3 python python-3.x python-asyncio

我经常看到类似于以下代码的代码(类似于aiohttp文档中的示例).

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

在下面的1行中有没有任何优点/缺点,假设你不想srv在获取它和返回之间对对象做任何事情?

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

use*_*ica 6

您似乎已经调整的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
Run Code Online (Sandbox Code Playgroud)

函数需要在yield from和之间做一些事情return,因此需要将返回值保存到变量中.如果在收益率和收益率之间没有必要做某事,那确实等同于做

return (yield from whatever)
Run Code Online (Sandbox Code Playgroud)

代替

srv = yield from whatever
return srv
Run Code Online (Sandbox Code Playgroud)

你可以在同一页面的其他例子中看到它:

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

对于一个像代码一样简单的例子,我认为你甚至不需要yield from.你应该能做到的

@asyncio.coroutine
def init(loop):
    return loop.create_server(web.Application().make_handler(), '0.0.0.0', 8080)
Run Code Online (Sandbox Code Playgroud)

虽然我不熟悉asyncio,所以我不能完全确定它不会与asyncio.coroutine装饰器奇怪地交互.