Получить объект кадра, в котором была определена функция - PullRequest
1 голос
/ 18 февраля 2012

Есть ли способ программно найти кадр, в котором была определена функция? Я ищу что-то вроде функции get_defining_frame, которая бы работала так:

def foo():
    def bar():
        pass
    return bar

bar = foo()

get_defining_frame(foo) # should be the same as inspect.currentframe()
get_defining_frame(bar) # should be the frame created by the call to foo

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Вы не можете получить такую ​​информацию, если не храните ее самостоятельно (возможно, декоратор). Посмотрите на bar.__code__ и bar.__closure__, возможно, они предоставляют вам достаточно информации. __closure__ не будет хранить весь контекст для того, когда bar был создан, только переменные, на которые ссылается bar для повышения эффективности памяти.

Декоратор, который должен добиться цели:

def save_frame(func):
    frame=inspect.currentframe().f_back
    func.__frame = frame
    return func

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

0 голосов
/ 18 февраля 2012

Кадры создаются / удаляются при каждом вызове функции. Поэтому, когда вы звоните:

get_defining_frame(bar)

в вашем примере кода кадр, в котором был создан bar, уже пропал.

Объекты функций не содержат ссылку на фрейм, в котором они были определены. Это хорошо, потому что это предотвратит освобождение всех других локальных переменных.

Зачем вам это нужно?

...