Почему нельзя использовать "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 12

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, пока проблема не будет решена.