2015-06-12 1 views
1

Скажем, я получаю фрейм стека с использованием sys._getframe(1), который, очевидно, не является текущим фреймом.Как перемещаться вверх и вниз между кадрами стека?

Теперь я хочу каким-то образом перейти к внешнему фрейму стека и выполнить оператор, например, x=10, чтобы создать переменную в этом фрейме.

Я понимаю, что это не хорошая практика, чтобы установить переменную таким образом, но это может быть другое утверждение. Итак, важная часть состоит в том, как перейти к этой структуре. with(frame), похоже, не работает.

Я думаю, что это должно быть возможно, иначе почему бы существовать две функции с именем getinnerframes и getouterframes в модуле inspect? Если вы не можете перейти к внешнему фрейму, почему у вас есть внутренние рамки?

Edit: В pdb модуле, у них есть две команды вверх и вниз с docs говоря

d (собственная) Переместить текущий кадр на один уровень вниз в трассировке стека (на новый кадр).

u (p) Переместить текущий кадр на один уровень вверх в стеке След (до более старого кадра).

Помогло ли это с моим делом? Если да, то как его использовать?

+0

Частично ответил на [Возможно ли записать в объект фрейма python, возвращаемый sys._getframe() из кода python, запущенного внутри интерпретатора?] (Http://stackoverflow.com/questions/626835/is-it -possible-to-write-to-a-python-frame-object-as-return-by-sys-getframe) – leewz

ответ

2

Это вообще не возможно. Если кадр соответствует коду уровня модуля, то вы можете сделать

exec 'x=10' in frame.f_globals, frame.f_locals 

в Python 2, или

exec('x=10', frame.f_globals, frame.f_locals) 

в Python 3. Однако, если кадр соответствует вызову функции или класса тела , то это будет выполняться x=10, как будто она встроена в определении класса вложенной в рамках фрейма:

If two separate objects are given as globals and locals, the code will be executed as if it were embedded in a class definition.

Никакой код вне текста функции не может создавать переменные, локальные для этой функции.

+0

Хорошо, если это правда, что может быть объяснением наличия функции 'getinnerframes' в' inspect'? И на что он должен вернуться? – bendtherules

+0

@bendtherules: все, что возвращает или обращается к кадрам, прежде всего, предназначено для проверки их данных, а не для их изменения. – user2357112

+0

Да, но что возвращает эта функция? – bendtherules

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