Python Glossary English

все 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Сообщить о неточности