web-dev-qa-db-fra.com

Attendre une fonction asynchrone dans Python

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.

11
Ivan Gozali

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.

1
Ivan Gozali