web-dev-qa-db-fra.com

Convertir un objet générateur en liste pour le débogage

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.

85
Seanny123

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.

Méthode générale pour échapper aux conflits de noms de fonctions/variables/débogueurs

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']
149
Jan Vlcinsky