Мое подозрение в том, что то, что я хочу сделать, не совсем понятно в Python. Вот несколько вложенных функций, которые называют друг друга. (В общем, они не должны быть лексически ограниченные, но нужно динамически вызывать друг друга.)Доступ к переменным функции вызывающего абонента в Python
def outer() :
s_outer = "outer\n"
def inner() :
s_inner = "inner\n"
do_something()
inner()
Теперь, когда я звоню do_something()
тогда я хотел бы получить доступ к переменным функций вызова дальше callstack, в этом случае 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()
?
Приветствия!
Я волновался, что это ответ. Ах хорошо. Независимо от того, что делает функция reach(), существует ли более компактный способ реализации вложенных для/если вообще? – Jens
@Jens Не может придумать ничего, что было бы более читаемым. Вы можете проверить, подходит ли вам просмотр через 'f_back' из' inspect.currentframe() '. – bereal