为什么不能在 f 字符串中使用“await”?

2024-05-28

为什么不能在 f 字符串中使用“await”?有什么方法可以强制 f 字符串在协程函数的上下文中评估格式表达式吗?

$ python3 
Python 3.6.0 (default, Mar  4 2017, 12:32:37) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> async def a(): return 1
... 
>>> async def b(): return 'The return value of await a() is {}.'.format(await a())
... 
>>> async def c(): return f'The return value of await a() is {await a()}'
... 
  File "<fstring>", line 1
    (await a())
           ^
SyntaxError: invalid syntax

从Python开始3.6, this 不可能。这将有可能在3.7根据消息问题 28942 --await 表达式f-strings https://bugs.python.org/issue28942在 Python 错误跟踪器上。

至于原因,作者PEP https://www.python.org/dev/peps/pep-0492/那介绍了async/await尤里·塞利瓦诺夫 (Yury Selivanov) 的表述是这样说的:

我怀疑原因是async/await中的关键字不正确 3.5/3.6,以及我们在分词器中识别它们的技巧在 f 字符串中不起作用。

我会将这个问题分配给我自己,以确保它在 3.7 中得到解决 一旦我们做了async/await关键词。

事实上,分词器似乎确实特别对待这些 https://github.com/python/cpython/blob/master/Parser/tokenizer.h#L69.

您对此感到困惑是正确的,因为格式化字符串被记录为支持所有有效的 Python 表达式 https://docs.python.org/3/reference/lexical_analysis.html#formatted-string-literals(这些表达需要适当的限制,即await in an async def功能)。

我不认为目前有任何方法可以规避这个问题。你需要坚持.format路线,直至问题解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不能在 f 字符串中使用“await”? 的相关文章

随机推荐