Почему нельзя использовать "wait" в f-строках?
Почему нельзя использовать "await" в f-строках? Существует ли какой-либо способ принудить 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
1 ответ:
Поскольку Python
3.6, это невозможно. Это будет возможно в3.7согласно сообщениям на выпуске 28942 -- ждите выражения вf-stringsна Python bug tracker.Что касается причины, то автор PEP , который ввел
async/awaitвыражаясь, Юрий Селиванов имел это сказать:Я подозреваю, что причина в том, что
async/awaitразве не правильные ключевые слова в 3.5 / 3.6, и хаки, которые мы имеем в tokenizer, чтобы распознать их не работают в f-строках.Я назначу эту проблему себе, чтобы убедиться, что она решена в 3.7 как только мы сделаем
async/awaitключевые слова.И действительно, токенизатор, кажется, обрабатывает их специально.
Вы были правы, что озадачились этим, поскольку форматированные строки документируются как поддерживающие все допустимые выражения Python (с соответствующими ограничениями, которые эти выражения влекут за собой, например,awaitв функцииasync def).I не думаю, что есть какой-то способ обойти это в данный момент. Вам нужно будет придерживаться маршрута
.format, пока проблема не будет решена.