Est-il possible de await
des appels arbitraires à une fonction async
à l'intérieur d'un débogueur Python?
Disons que j'ai le code suivant dans un fichier main.py
:
import asyncio
async def bar(x):
return x + 1
async def foo():
import ipdb; ipdb.set_trace()
asyncio.run(foo())
Maintenant, je veux tester l'appel de bar()
avec un argument à l'intérieur du débogueur pour tester les résultats. Les événements suivants se produisent:
$ python3 main.py
> /Users/user/test/main.py(8)foo()
7 import ipdb; ipdb.set_trace()
----> 8 return None
9
ipdb> bar(1)
<coroutine object bar at 0x10404ae60>
main.py:1: RuntimeWarning: coroutine 'bar' was never awaited
import asyncio
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
ipdb> await bar(1)
*** SyntaxError: 'await' outside function
Bien sûr, je peux contourner ce problème en ayant x = await bar(1)
au-dessus de mon ipdb.set_trace()
, puis en inspectant les résultats, mais je ne peux pas essayer d'appeler mes fonctions en temps réel pendant que le débogueur est actif.
On dirait qu'il commence à y avoir plus de support pour cette fonctionnalité depuis Python 3.8 . En particulier, regardez ce problème bpo-37028
Si vous êtes toujours sur Python 3.7, peut-être aiomonitor pourrait avoir quelque chose qui prend en charge cette fonctionnalité dans une certaine mesure.