Почему нельзя использовать "ожидание" в f-строках?

Почему нельзя использовать "ожидание" в 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 в соответствии с сообщениями Issue 28942 - ожидание выражений в f-strings в Python./p >

По этой причине автор PEP, в котором представлены выражения async/await, Юрий Селиванов, это сказать:

Я подозреваю, что причина в том, что async/await не являются правильными ключевыми словами в 3.5/3.6, а хаки, которые у нас есть в токенизаторе для их распознавания, не работают в f-строках.

Я задам этот вопрос себе, чтобы убедиться, что он разрешен в 3.7 как только мы создадим ключевые слова async/await.

и действительно, токенизатор действительно выглядит относиться к ним специально.

Вы были правы, чтобы быть озадаченным этим, поскольку форматированные строки документированы как поддерживающие все допустимые выражения Python (с соответствующими ограничениями, которые эти выражения влекут за собой т.е. await в функции async def).

Я не верю, что есть способ обойти это на данный момент. Вам нужно будет придерживаться маршрута .format, пока проблема не будет решена.