Как получить доступ к переменной вложенных функций в Python?

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

Вот фрагмент кода,

class main(object):
    def sub_fun(self):
        def inner_fun(self):
            self.var = 10
        inner_fun(self)

p = main().sub_fun()

Теперь, как получить доступ к var атрибут p?

2 ответа

Решение

Проблема в том, что main.sub_fun возвращается None, Есть два простых обходных пути:

  1. Просто сохраните ссылку на элемент, который вы создаете перед вызовом метода:

    p = main()
    p.sub_fun()
    print(p.var)
    

    Это лучший вариант на мой взгляд.

  2. Если вы действительно хотите, чтобы однострочная версия работала, верните self от sub_fun:

    def sub_fun(self):
        def inner_fun():
            self.var = 10
        inner_fun()
        return self
    
    print(main().sub_fun().var)
    

В любом случае вам не нужно проходить self в inner_fun, Он всегда будет смотреть во внешнюю область, когда локальное имя не найдено. #2 показывает пример этого.

class main(object):
    def sub_fun(self):
        def inner_fun(self):
          self.var = 10
p = main()

Вы не можете получить доступ к переменной вложенной функции, потому что она закрыта и доступна только непосредственному родителю. var доступен только для inner_fun. Смотрите ниже для другой реализации.

class main(object):
def outer_function(self):

    def inner_function(self):
        self.x = 10
        return self.x

    out = inner_function(self) # Accessing the inner function
    return out 

p = main()
q = p.outer_function() 
print(q)

Если для объекта класса или родительской функции требуется доступ к переменной внутри дочерней вложенной функции, то переменная должна быть перемещена во внешнюю область путем ее возврата. В противном случае область видимости переменной будет находиться только в так называемой дочерней вложенной функции.

Другие вопросы по тегам