2009-04-15 9 views
3

EDIT: Cette question a été résolue avec l'aide d'apphacker et ConcernedOfTunbridgeWells. J'ai mis à jour le code pour refléter la solution que j'utiliserai. Je suis en train d'écrire un simulateur d'intelligence de l'essaim et je cherche à donner à l'utilisateur un moyen facile de déboguer ses algorithmes. Parmi les autres sorties, je pense qu'il serait utile de donner à l'utilisateur une impression du contexte d'exécution au début de chaque étape de l'algorithme.Récupération/Impression du contexte d'exécution

Le code suivant permet d'obtenir ce dont j'avais besoin.

import inspect 

def print_current_execution_context(): 
    frame=inspect.currentframe().f_back #get caller frame 
    print frame.f_locals #print locals of caller 

class TheClass(object): 
    def __init__(self,val): 
     self.val=val 
    def thefunction(self,a,b): 
     c=a+b 
     print_current_execution_context() 


C=TheClass(2) 
C.thefunction(1,2) 

Cela donne le résultat attendu de:

{'a': 1, 'c': 3, 'b': 2, 'self': <__main__.TheClass object at 0xb7d2214c>} 

Merci à apphacker et ConcernedOfTunbridgeWells qui m'a pointé vers cette réponse

+0

Il n'est pas nécessaire d'étiqueter le titre puisque les étiquettes sont officiellement supportées. Autant d'attention [Python] dans le titre peut apporter à votre question, il ne mesure pas le grand fond jaune que je reçois lorsque vous utilisez réellement 'python' comme une balise. –

+0

Ne pas modifier la question pour dire "résolu" - Acceptez la réponse qui l'a résolu. Ou postez votre propre réponse. –

+0

Dans l'avenir, je vais, cependant l'édition simplement remplacé # ???? avec 2 lignes qui ont réalisé la fonction, donc ce n'était pas un changement radical. –

Répondre

1

essayer:

class TheClass(object): 
    def __init__(self,val): 
     self.val=val 
    def thefunction(self,a,b): 
     c=a+b 
     print locals() 


C=TheClass(2) 
C.thefunction(1,2) 
+0

Cela fonctionne bien merci. Existe-t-il un moyen d'intégrer ceci dans une autre fonction? Comme il y a d'autres actions qui se produisent à la fin de chaque itération, il serait bon de les regrouper dans une seule fonction. Je me rends compte que les locals() pourraient être passés dans la fonction, mais ce n'est pas optimal. –

+0

Vous pouvez utiliser une fermeture et un dictionnaire de plus grande portée que vous mettez à jour avec les valeurs d'un appel aux sections locales à chaque itération, mais si le passage local() dans la fonction n'est pas optimal, je doute qu'une fermeture soit. –

1

Vous pouvez utiliser __locals__ pour obtenir le contexte d'exécution locale. Voir this stackoverflow posting pour une discussion qui peut également être pertinente.

+0

Merci, le fil lié ressemble beaucoup à ce que j'espérais accomplir. J'étudierai en essayant de saisir '__locals__' dans les cadres de la pile et éditerai ma question pour rendre compte des résultats. Merci, Mike –

Questions connexes