Ajouter et supprimer points d'arrêt sans éditer les fichiers source
Bien que vous puissiez ajouter des points d'arrêt en ajoutant breakpoint()
o set_trace()
à votre code, cette approche pose deux problèmes :
- Tout d'abord, une fois que vous avez commencé à exécuter votre code, il n'y a aucun moyen de supprimer votre point d'arrêt. Je constate souvent qu'une fois que j'ai commencé à exécuter mon code et que j'ai atteint un premier point d'arrêt, je veux en placer un autre et supprimer le premier point d'arrêt. Après
breakpoint()
me laisse dans le débogueur, je peux ajouter des points d'arrêt supplémentaires, mais je ne peux pas supprimer le point d'arrêt initial. Bien qu'il soit possible d'atténuer quelque peu ce problème en plaçant le point d'arrêt initial de breakpoint
Si vous avez des tests paramétrés, même cela est limité. Il se peut que je me retrouve à répéter cont
très souvent.
- Deuxièmement, il faut modifier le code source. Vous devez vous rappeler de supprimer tous les
breakpoint()
avant de soumettre du code au contrôle de version, vous devez les supprimer avant de changer de branche, etc. Il m'arrive parfois de vouloir utiliser le débogueur pour comparer des tests entre deux branches, et le fait de devoir éditer le code source pour ajouter un point d'arrêt à chaque fois rend cet exercice considérablement plus lent et plus sujet aux erreurs. Je peux même vouloir ajouter un point d'arrêt dans une bibliothèque que j'appelle, auquel cas le fichier que j'édite ne se trouve peut-être même pas dans mon dépôt git mais quelque part dans mon environnement conda, ce qui augmente le risque d'oublier de le supprimer. Editer des fichiers pour ajouter des points d'arrêt est, à mon humble avis, laid.
Ajouter et supprimer interactivement sans éditer de fichiers source, vous pouvez évoquer des points d'arrêt pytest
comme suit (dans le shell bash) :
python -mipdb $(type -p pytest) -s test_fileset.py
Les -s
est crucial ici, car il empêche pytest de manipuler stdin et stdout, et lorsqu'il est exécuté dans le débogueur, pytest ne manipulera pas stdin et stdout et tout se passera mal. La syntaxe d'appel exacte sera différente selon les shells.