доступ к переменным вызывающей функции - PullRequest
0 голосов
/ 03 мая 2018

следующий код

class Foo(object):
    def do_something(self):
        print(main.func_code.co_varnames)
        for item in main.func_code.co_varnames:
            eval(item)

def main():
    a = 1
    b = Foo()
    b.do_something()

main()

напечатает

('a', 'b')

вместе с сообщением об ошибке, заканчивающимся

name 'a' is not defined

Каким-то образом объект Foo может получить имена локальных переменных другой функции, но не может ничего с ними сделать. Как я могу это исправить?

Уровень техники. Этот вопрос для целей отладки. Я хочу иметь возможность отображать информацию о переменных, которые созданы в моем коде.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018
  • Используйте inspect.currentframe, чтобы получить объект стека фрейма
  • Переместить стек вызовов на 1 кадр с атрибутом f_back
  • Доступ к локальным переменным этого фрейма через атрибут f_locals
import inspect

def get_variables():
    frame = inspect.currentframe().f_back
    print(frame.f_locals)

Использование:

def main():
    a = 1
    b = 'hello world'

    get_variables()

main()
# output: {'b': 'hello world', 'a': 1}
0 голосов
/ 03 мая 2018

Локальные переменные определены для функции. Таким образом, пока функция определена, интерпретатор «знает», что будут 2 локальные переменные с именами a и b. Полезно для выделения памяти, когда функция будет вызвана. Думайте об этом как проект.

Затем, когда вы попытаетесь eval какой-то строке, она сделает это, используя контекст (locals() и globals()) того, где находится eval. У вас нет a в этой области. Следовательно, он терпит неудачу, поскольку он не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...