【问题标题】:What is async in Python?Python 中的异步是什么?
【发布时间】:2017-09-03 09:30:45
【问题描述】:

我已经了解了新的 Python “关键字”asyncawait。然而,它们既不是真正的关键字,也不是保留在命名空间中。

>>> import keyword
>>> keyword.iskeyword("async")
False
>>> async
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'async' is not defined

在示例中,我希望 TrueSyntaxError 作为关键字。

那么,async 在 Python 中到底是什么?它是如何工作的?

【问题讨论】:

  • async 仅适用于 Python 3.5。是你用的那个版本吗?
  • asyncawait 还不是“真正的”关键字,但它们将出现在 Python 3.7 中。
  • 我使用 Python 3.6.0
  • 根据PEP 492async是一个语句限定符
  • @Thyrst':如果您查看 Python 3.6 的 reference grammar,您会发现 asyncawait 在没有旁边没有函数定义的情况下没有独立的标识。所以它们不是关键字,但是如果你在它旁边放一个 lambda 函数,编译器会识别它们。

标签: python python-3.x asynchronous async-await keyword


【解决方案1】:

出于向后兼容的目的,在 Python 3.5 和 3.6 中,asyncawait 通过 ugly tokenizer hack 进行解析。在 async def 函数定义中,或者对于直接在 def 之前的 async,标记器将 asyncawaitNAME 标记替换为 ASYNCAWAIT 标记;在其他情况下,标记器为asyncawait 发出常规的NAME 标记,将它们视为标识符。

您可以在Parser/tokenizer.c 中看到处理它的代码,您可以在PEP 492 中找到向后兼容计划,该PEP 引入了asyncawait 语法。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多