Мое подозрение в том, что то, что я хочу сделать, не совсем выполнимо чистым способом в Python. Вот несколько вложенных функций, которые называют друг друга. (В общем, они не должны лексически ограничены, но им необходимо динамически звонить друг другу.)
def outer() :
s_outer = "outer\n"
def inner() :
s_inner = "inner\n"
do_something()
inner()
Теперь, когда я вызываю do_something()
, я хотел бы получить доступ к переменным вызывающих функций дальше по стоп-казу, в этом случае s_outer
и s_inner
.
К сожалению, ключевое слово nonlocal
здесь помогает мне, только если я определяю do_something()
внутри функции inner()
. Однако, если я определяю его на том же уровне, что и outer()
, тогда ключевое слово nonlocal
не будет работать.
Однако я хочу вызвать do_something()
из других функций, но всегда выполняю его в соответствующем контексте и получаю доступ к соответствующим областям.
Чувствуя себя непослушным, я написал небольшой аксессуар, который я могу вызвать из do_something()
следующим образом:
def reach(name) :
for f in inspect.stack() :
if name in f[0].f_locals : return f[0].f_locals[name]
return None
а затем
def do_something() :
print( reach("s_outer"), reach("s_inner") )
отлично работает.
Мои два вопроса:
-
Есть ли лучший способ решить эту проблему? (Кроме того, чтобы обернуть соответствующие данные в dicts и передать эти dicts явно на
do_something()
) -
Есть ли более элегантный/укороченный способ реализации функции
reach()
?
Ура!