2009-04-15 2 views
3

EDIT: Этот вопрос был решен с помощью apphacker и ConcernedOfTunbridgeWells. Я обновил код, чтобы отразить решение, которое я буду использовать.Извлечение/Печать контекста выполнения

В настоящее время я пишу симулятор разведки роя и стараюсь дать пользователю простой способ отладить их алгоритмы. Среди других результатов я считаю, что было бы полезно предоставить пользователю распечатку контекста выполнения в начале каждого шага алгоритма.

Следующий код достигает того, что мне нужно.

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) 

Это дает ожидаемый результат:

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

Спасибо apphacker и ConcernedOfTunbridgeWells, который указал мне на этот ответ

+0

Не нужно отмечать заголовок, так как теги официально поддерживаются. Столь большое внимание [Python] в заголовке может привести к вашему вопросу, оно не измеряет большой желтый фон, который я получаю, когда вы на самом деле используете «python» в качестве тега. –

+0

Не редактируйте вопрос, чтобы сказать «разрешено». Примите ответ, который его решил. Или напишите свой собственный ответ. –

+0

В будущем я буду, однако редактирование просто заменено # ???? с 2 линиями, которые реализовали функцию, поэтому это не было резким изменением. –

ответ

1

попробовать:

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

Это хорошо работает. Есть ли способ вставить это в другую функцию? Поскольку есть другие действия, которые происходят в конце каждой итерации, и было бы неплохо сгруппировать их в рамках одной функции. Я понимаю, что locals() могут быть переданы в функцию, однако это не оптимально. –

+0

Вы можете использовать закрытие и словарь, более высокий по объему, который вы обновляете значениями из вызова локальным пользователям во время каждой итерации, но если передача locals() в функцию не является оптимальной, я сомневаюсь, что это будет закрытие. –

1

Вы можете использовать __locals__ для получения локального контекста выполнения. См. this stackoverflow posting для обсуждения, которое также может быть уместным.

+0

Спасибо, связанная нить звучит очень похоже на то, что я надеялся выполнить. Я буду исследовать захват '__locals__' из фреймов стека и отредактировать мой вопрос, чтобы сообщить о результатах. Спасибо, Майк –

Смежные вопросы