Comment voulez-vous regarder une variable dans apb
Je suis le débogage d'un script python, et je veux regarder une variable pour un changement (un peu comme, vous pouvez regarder une adresse mémoire dans gdb). Est-il un moyen de faire cela?
Vous devez vous connecter pour publier un commentaire.
Ici est un hacky façon de le faire avec
pdb
. Ces commandes peuvent être mis dans votre~/.pdbrc
pour le chargement automatique chaque fois que vous utilisezpdb
.Cela ajoute deux commandes,
nextwatch
etstepwatch
qui prennent chacun un nom de variable varname comme argument. Ils vont faire une copie de l'image actuelle de la variable locale pour varname si possible, et de garder de l'exécution denext
oustep
, respectivement, jusqu'à ce que le nom des points de changements.Cela fonctionne dans Disponible 2.7.2 mais s'appuie sur certains
pdb
internes de sorte qu'il sera probablement casser ailleurs..pdbrc
ne fonctionne pas. Même quand je colle le code ci-dessus dans(pdb):
de l'environnement, lorsque je lancestepwatch
ounextwatch
, il dit__dict
et les autres ne sont pas définis. Pourriez-vous mettre à jour votre code python 3.5? merciPour regarder une variable lorsque vous frappez un point d'arrêt, vous pouvez utiliser le
commands
de commande. E. g. l'impressionsome_variable
lors de la frappe point d'arrêt n ° 1 (exemple canonique deapb
doc).Mise à jour pour Python 3
En outre, vous pouvez utiliser le
condition
de commande pour assurer le point d'arrêt est seulement frapper chaque fois que la variable prend une valeur certaine.par exemple:
Pour Python 3:
vous pouvez utiliser affichage la fonctionnalité de l'apb
Une fois que vous frappez le point d'arrêt juste type
ipdb> affichage expression
exemple:
comme vous pouvez le voir, chaque fois que vous tapez à l'affichage, il permet d'imprimer toutes vos montres (expressions). Vous pouvez utiliser builtin fonction
undisplay
de supprimer certains de la montre.Vous pouvez également utiliser pp expression à prettyprint l'expression (très utile)
Une solution possible est d'utiliser apb++:
Puis "marquer" l'objet que vous souhaitez regarder avec le décorateur
@pdb.break_on_setattr
:Ici
pdb
va casser de tout changement de l'attributbar
sur toute Foo-objet.Mises en garde
Seulement des invocations du sous-jacent
__setattr__
méthode de déclenchement du point d'arrêt. Cela signifie quef.bar = 'XYZ'
etsetattr(f, 'XYZ')
de travail, mais de la manipulation de labar
-objet n'entraînera pas de point d'arrêt:Remarque:
@break_on_setattr
ne fait pas partie de la normepdb
-module.pdb
est substituée/singe-patché par lepdbpp
-paquet.Vous pouvez également envelopper un objet existant (par l'intermédiaire de sa classe) après
pdb.set_trace()
: