¿Por qué no es posible usar "await" en f-strings? ¿Hay alguna forma de obligar a f-strings a evaluar las expresiones de formato en el contexto de una función de rutina?
$ 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 syntaxA partir de Python 3.6 , esto no es posible . Será posible en 3.7 de acuerdo con los mensajes del problema 28942: espere expresiones en f-strings en el rastreador de errores de Python.
En cuanto a la razón, el autor del PEP que introdujo las expresiones async / await , Yury Selivanov, dijo lo siguiente:
Sospecho que la razón es que
async/awaitno son palabras clave adecuadas en 3.5/3.6, y los trucos que tenemos en tokenizer para reconocerlos no funcionan en f-strings.Me asignaré este problema para asegurarme de que se resuelva en 3.7 una vez que hagamos palabras clave
async/await.
y, de hecho, el tokenizador parece tratarlos de manera especial .
Tenía razón al estar desconcertado por esto, ya que las cadenas formateadas están documentadas como compatibles con todas las expresiones válidas de Python (con las limitaciones apropiadas que implican esas expresiones, es decir, await en una función de async def ).
No creo que haya ninguna forma de eludir esto en este momento. Deberá seguir con la ruta .format hasta que se resuelva el problema.