gpt4 book ai didi

python - 如何从调用者访问变量,即使它不是封闭范围(即实现动态范围)?

转载 作者:太空狗 更新时间:2023-10-29 18:07:17 24 4
gpt4 key购买 nike

考虑这个例子:

def outer():
s_outer = "outer\n"

def inner():
s_inner = "inner\n"
do_something()

inner()

我希望 do_something 中的代码能够访问调用堆栈更上层的调用函数的变量,在本例中为 s_outers_inner。更一般地说,我想从各种其他函数调用它,但总是在它们各自的上下文中执行它并访问它们各自的范围(实现动态范围)。

我知道在 Python 3.x 中,nonlocal keyword allows accessinners_outer。不幸的是,只有在 inner 中定义它时,它才有助于 do_something。否则,inner 不是词法封闭范围(类似地,outer 也不是,除非 do_something 定义在外部).

我弄清楚了如何使用标准库 inspect 检查堆栈帧,并制作了一个我可以从 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") )

工作得很好。

reach 可以更简单地实现吗?我还能如何解决这个问题?

最佳答案

没有,在我看来,也不应该有优雅的方式来实现 reach,因为它引入了一个新的非标准间接寻址,这真的很难理解、调试、测试和维护。正如 Python 的咒语(尝试 import this)所说:

Explicit is better than implicit.

所以,只需传递参数即可。从今天开始, future 的你将非常感谢你。

关于python - 如何从调用者访问变量,即使它不是封闭范围(即实现动态范围)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com