Получение ссылок на функциональные объекты в стеке выполнения из объекта фрейма?
Учитывая выход inspect.stack()
Можно ли получить объекты функции из любого места из стекового фрейма и вызвать их? Если так, то как?
(Я уже знаю, как получить имена функций.)
Вот что я получаю: скажем, я - функция, и я пытаюсь определить, является ли мой вызывающий объект генератором или обычной функцией? Мне нужно позвонить inspect.isgeneratorfunction()
на объекте функции. А как ты выясняешь, кто тебе звонил? inspect.stack()
, право? Так что, если я смогу как-то соединить их, у меня будет ответ на мой вопрос. Возможно, есть более простой способ сделать это?
2 ответа
Вот фрагмент кода, который делает это. Нет проверки ошибок. Идея состоит в том, чтобы найти в локальных элементах родительского объекта вызываемый объект функции. Возвращаемый объект функции должен быть родительским. Если вы хотите также выполнить поиск по встроенным функциям, просто посмотрите на стеки [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]
В случае с классом можно написать следующее (вдохновленный решением Marcin)
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)