Как получить доступ к переменной вложенных функций в Python? - PullRequest
0 голосов
/ 31 октября 2018

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

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

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

p = main().sub_fun()

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018
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)

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

0 голосов
/ 31 октября 2018

Проблема в том, что 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 показывает пример этого.

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