11
votes

Imprimer des noms et des matières variables comme outil de débogage; À la recherche de raccourci Emacs / Python

Je trouve moi-même ajouter des déclarations "print" de débogage assez souvent - des choses comme ceci:

print("a_variable_name: %s" % a_variable_name)


1 commentaires

Après toutes ces années et trébuchant avec cette question à nouveau, je l'obtiens enfin, ce dont nous avions besoin de tous les plus syntaxiques de macros! c'est à dire. dans # Julia-lang : @show foo = 1.0 + 3IM / 2 impressions; FOO = 1.0 + (3IM) / 2 = 1.0 + 1.5IM , où @show est une macro et peut être utilisé pour anyoter toute expression (dans Julia Tout est une expression ), vous pouvez voir le code généré de la macro expansion ici: git.io/vgdch J'ai trouvé cette implémentation de Macros syntaxiques pour Python:

3 Réponses :


1
votes

Ne faites pas ça. Utiliser un débogueur décent à la place. Le moyen le plus simple de le faire est d'utiliser ipython et soit à attendre une exception (le débogueur Définissez automatiquement) ou pour provoquer un en exécutant une instruction illégale (par exemple, 1/0 ) à la partie du code que vous souhaitez inspecter.


1 commentaires

+1 Pour utiliser le bon outil, il essaie de marteler un clou avec un couteau suisse de l'armée



9
votes

Parfois, un débogueur est excellent, mais parfois à l'aide d'énoncés d'impression est plus rapide et plus facile à configurer et à utiliser de manière répétée.

Ceci ne peut être approprié que pour le débogage avec CPPHON (puisque tous les pythons impliquent Inspect.Currentframe et inspect.getterframes code>), mais je trouve cela utile pour avoir coupé sur la frappe: p>

in utils_debug.py:

C-x (   # start keyboard macro
C-s pv('
C-a
C-k     # change this to M-; if you just want to comment out the pv call
C-x )   # end keyboard macro


2 commentaires

Votre chemin peut ne pas être très élégant, mais je trouve cela assez utile, ayant le même besoin que SCHOF, évite de taper de manière redondante lors du débogage des variables


Je sais que c'est une vieille réponse, alors les choses auraient pu changer. Mais je suis tombé sur cela avec Google, je vais donc laisser cela ici. Maintenant, vous pouvez directement faire image = inspecter.Currentframe (). F_back qui est un peu plus agréable et plus clair :)