关于全局范围的困惑

时间:2018-02-14 14:13:38

标签: python python-3.x dictionary scope globals

当我重构我的代码时,我重写了一个像这样的代码片段

#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中的所有已定义变量并将它们转发给我的回调?

提前致谢

1 个答案:

答案 0 :(得分:0)

模块创建名称空间,a.py内的代码尽管被a.py导入,但不会看到$("#my_id_container").html("<table><thead></thead><tbody></tbody></table>"); 变量。如果他们在同一个模块中并且你只是阅读vars,只需使用他们的名字,他们就会被选中。对于编写变量,您需要将它们声明为全局变量。

要获得所有全局变量,这些链接可以提供帮助(基本上你必须导入它们)

python-global-dict-across-different-file-script

get-global-variables-from-file-as-dict