Почему нельзя использовать "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
, пока проблема не будет решена.