Доступна функция более высокого уровня: inspect.stack()
. Это дает вам список FrameInfo()
объектов, которые имеют ссылку frame
:
for frameinfo in inspect.stack(0):
if variable in frameinfo.frame.f_locals:
return frameinfo.frame.f_locals[variable]
Я установил число строк исходного кода (параметр context
) на ноль, нет смысла загружатьстроки исходного кода просто для проверки локальных переменных.
Функция stack()
в основном реализована следующим образом:
return inspect.getouterframes(inspect.getcurrentframe(), context)
и getouterframes()
просто следует ссылкам frame.f_back
до тех пор, пока None
не станетнашел. Таким образом, вы могли бы также реализовать это с помощью цикла while
:
frame = inspect.getcurrentframe()
while frame:
if variable in frame.f_locals:
return frame.f_locals[variable]
frame = frame.f_back
Это, безусловно, более легкий вес, поскольку это позволяет избежать создания FrameInfo()
экземпляров для всех кадров в стеке, избегает самоанализа имен файлов для всех кадров. и не требует доступа ко всем связанным фреймам, если переменная найдена раньше.