все Python 3inspectфункция
inspect.stack()
стек и кадры
Список FrameInfo для всех кадров стека вызовов — от текущей функции наружу до модуля.
Синтаксис
inspect.stack(context=1) -> list[FrameInfo]
Вызов дорогой: для каждого кадра inspect читает исходный файл ради строки code_context, поэтому в горячем коде пишут inspect.stack(0) или берут один кадр через inspect.currentframe().f_back. Вторая ловушка — утечка: FrameInfo держит живой кадр, кадр держит свои локальные переменные, а список, сохранённый в локальной переменной, замыкает цикл ссылок — объекты переживают функцию до прихода сборщика мусора. Удаляйте результат в finally (del st). Пути и номера строк зависят от того, где лежит файл.
Примеры
import inspect
def inner():
st = inspect.stack(0) # 0 — без чтения исходников
try:
return [fi.function for fi in st]
finally:
del st # разорвать цикл кадр → список → кадр
def outer():
return inner()
print(outer()) # → ['inner', 'outer', '<module>']
print(inspect.stack()[0].lineno) # → ? номер строки в файле
import gc, inspect, weakref
class Obj: pass
def work():
obj = Obj()
st = inspect.stack(0) # кадр ссылается на st, st — на кадр
return weakref.ref(obj)
gc.disable()
r = work()
print(r() is None) # → False — obj пережил функцию
gc.collect()
print(r() is None) # → True — освободил только сборщик циклов
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности