Lorsque je débogue dans Python avec IPython, il m'arrive d'atteindre un point de rupture et je souhaite examiner une variable qui est actuellement un générateur. La façon la plus simple de le faire est de la convertir en liste, mais je ne vois pas trop comment il est facile de le faire en une seule ligne dans ipdb
, car je connais si peu Python.
Appelez simplement list
sur le générateur.
lst = list(gen)
lst
Sachez que cela affecte le générateur qui ne retournera aucun autre article.
Vous ne pouvez pas non plus appeler directement list
dans IPython, car cette commande est en conflit avec une commande permettant de répertorier les lignes de code.
Testé sur ce fichier:
def gen():
yield 1
yield 2
yield 3
yield 4
yield 5
import ipdb
ipdb.set_trace()
g1 = gen()
text = "aha" + "bebe"
mylst = range(10, 20)
qui lors de l'exécution:
$ python code.py
> /home/javl/sandbox/so/debug/code.py(10)<module>()
9
---> 10 g1 = gen()
11
ipdb> n
> /home/javl/sandbox/so/debug/code.py(12)<module>()
11
---> 12 text = "aha" + "bebe"
13
ipdb> lst = list(g1)
ipdb> lst
[1, 2, 3, 4, 5]
ipdb> q
Exiting Debugger.
Il y a des commandes de débogage p
et pp
qui _ print
et prettyprint
toute expression qui les suivra.
Donc, vous pouvez l'utiliser comme suit:
$ python code.py
> /home/javl/sandbox/so/debug/code.py(10)<module>()
9
---> 10 g1 = gen()
11
ipdb> n
> /home/javl/sandbox/so/debug/code.py(12)<module>()
11
---> 12 text = "aha" + "bebe"
13
ipdb> p list(g1)
[1, 2, 3, 4, 5]
ipdb> c
Il existe également une commande exec
, appelée en préfixant votre expression avec !
, qui oblige le débogueur à prendre votre expression sous la forme Python.
ipdb> !list(g1)
[]
Pour plus de détails, voir help p
, help pp
et help exec
dans le débogueur.
ipdb> help exec
(!) statement
Execute the (one-line) statement in the context of
the current stack frame.
The exclamation point can be omitted unless the first Word
of the statement resembles a debugger command.
To assign to a global variable you must always prefix the
command with a 'global' command, e.g.:
(Pdb) global list_options; list_options = ['-l']