Получение ссылок на функциональные объекты в стеке выполнения из объекта фрейма?

StackOverflow https://stackoverflow.com/questions/1034688

  •  06-07-2019
  •  | 
  •  

Вопрос

Учитывая вывод inspect.stack () , возможно ли получить функциональные объекты из любого места в кадре стека и вызвать их? Если да, то как?

(я уже знаю, как получить имена функций.)

Вот что я получаю: скажем, я функция, и я пытаюсь определить, является ли мой вызывающий объект генератором или обычной функцией? Мне нужно вызвать inspect.isgeneratorfunction () для объекта функции. А как ты выясняешь, кто тебе звонил? inspect.stack () , верно? Так что, если я смогу как-то соединить их, у меня будет ответ на мой вопрос. Возможно, есть более простой способ сделать это?

Это было полезно?

Решение

Вот фрагмент кода, который это делает. Нет проверки ошибок. Идея состоит в том, чтобы найти в локальных источниках родительского объекта вызываемый объект функции. Возвращаемый объект функции должен быть родительским. Если вы хотите также выполнить поиск по встроенным функциям, просто посмотрите на стеки [2] [0] .f_builtins.

def f():
    stacks  = inspect.stack()
    grand_parent_locals = stacks[2][0].f_locals
    caller_name = stacks[1][3]
    candidate = grand_parent_locals[caller_name]

В случае с классом можно написать следующее (вдохновленный решением Марцина)

class test(object):
    def f(self):
        stack = inspect.stack()
        parent_func_name = stack[1][3]
        parent_func = getattr(self, parent_func_name).im_func

Другие советы

Я выбрал следующий подход, очень похожий на ответ Эолмара.

stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top