Доступ к переменной по имени, определенному в родительской функции из вложенной функции - PullRequest
2 голосов
/ 11 июля 2019

Есть ли способ использовать что-то вроде globals() или locals() для доступа к переменной, определенной в родительской функции по имени (т.е. в виде строки)?

Оба эти примера дают KeyError: 'x':

def f(): 
    x = 1 
    def g(): 
        print(globals()['x']) 
    g()

def f(): 
    x = 1 
    def g(): 
        print(locals()['x']) 
    g()

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Да, это возможно, но вы работаете с Python, не делайте этого:

In [1]: import inspect

In [2]: def f():
   ...:     x = 1
   ...:     def g():
   ...:         print(inspect.currentframe().f_back.f_locals['x'])
   ...:     g()
   ...:

In [3]: f()
1

Серьезно, не надо.Пишите хороший код, а не плохой код.Для всех нас.

1 голос
/ 11 июля 2019

Я не совсем уверен насчет его полезности, но вы можете сделать это, проверив кадр стека включающей функции, т.е. кадра на глубине 1, и получив x из locals dict:

In [1]: import sys

In [2]: def f():
   ...:     x = 1
   ...:     def g():
   ...:         print(sys._getframe(1).f_locals['x'])
   ...:     g()
   ...:    
In [3]: f()
1
0 голосов
/ 11 июля 2019

Почему бы просто не передать значение дочерней функции следующим образом:

def f(): 
    x = 1 
    def g(parameter): 
        print(parameter) 
    g(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...