当我重构我的代码时,我重写了一个像这样的代码片段
#Some initialization...
for iter in range(max_loops):
#Do some stuff
#....
if iter % print_modulo == 0:
print("Iteration %d, Energy: %f, ..." % (iter, current_mse))
分成两个不同的部分,一个在一个类中,另一个在调用该类。由于我有多个回调,我决定获取调用者的全局变量以获得快速原型
a.py
import b
import inspect
def outputCallback(iter):
if iter % print_modulo == 0:
context = inspect.stack()[1][0].f_globals
print("Iteration %d, Energy: %f, ..." % (iter,
context['current_mse'])
#Some initialization...
opt = b.opt()
opt.run(iterations, [outputCallback])
b.py
class opt:
def run(self, max_loops, iteration_callbacks=[]):
for iter in range(max_loops):
#Do some stuff
#...
for callback in iteration_callbacks:
callback(iter)
但代码因密钥错误而崩溃。我调试了与PyCharm的行并尝试了不同的堆栈,但据我所知,inspect.stack()[0][0].f_globals
从a.py返回全局变量,但调试器的调用堆栈告诉我上面的堆栈帧{ {1}}是outputCallback
(正如预期的那样)。
我还尝试通过run
在b中调用我的回调,并将outputCallback更改为callback(iter, globals())
,但仍然遇到同样的错误。
我做错了什么?我怎样才能简单地捕获opt.run中的所有已定义变量并将它们转发给我的回调?
提前致谢
答案 0 :(得分:0)
模块创建名称空间,a.py
内的代码尽管被a.py
导入,但不会看到$("#my_id_container").html("<table><thead></thead><tbody></tbody></table>");
变量。如果他们在同一个模块中并且你只是阅读vars,只需使用他们的名字,他们就会被选中。对于编写变量,您需要将它们声明为全局变量。
要获得所有全局变量,这些链接可以提供帮助(基本上你必须导入它们)