【问题标题】:await raises SyntaxError when the function called has the async keyword: Python当调用的函数具有 async 关键字时,await 会引发 SyntaxError:Python
【发布时间】:2018-11-02 07:07:21
【问题描述】:

我在一个单独的脚本中有一个带有 async 关键字的函数,它是这样的:

async def search_gifs(self, query:str, limit:int = 25, offset:int = 0, rating: rating = rating.G, lang:language = None):
    if language == None:
        lang_to_use = self.lang
    result = await requests.get(self.end_point + "gifs/search", api_key = self.key, q = query, limit=limit, offset=offset, rating=rating.value, lang=lang_to_use.value)
    print(result.json())

但是,当我尝试使用 await 调用它时,它会引发 SintaxError

await client.search_gifs("lol")

>>> await client.search_gifs("lol")
               ^
    SyntaxError: invalid syntax

search_gifsClient 类中的一个函数)

我做错了吗?我正在使用 Python 3.6

【问题讨论】:

    标签: python async-await python-asyncio


    【解决方案1】:

    await 仅在 async def 内部有效,因此在顶层不起作用。这是因为await 的约定是它必须能够suspend当前协程,并且在顶层没有协程可以暂停。

    要从解释器测试协程,请使用asyncio.run,或者在 Python 3.6 中使用run_until_complete

    >>> asyncio.get_event_loop().run_until_complete(client.search_gifs("lol"))
    

    您的代码的另一个问题是await requests.get(...) 不起作用,因为requests 不是异步库。相反,请使用 asyncio 感知库,例如 aiohttp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 2018-07-20
      • 1970-01-01
      • 2012-11-28
      • 2023-03-27
      • 2016-06-09
      • 2017-12-17
      相关资源
      最近更新 更多