【问题标题】:Confusion about globals scope对全局范围的困惑
【发布时间】:2018-07-25 03:36:12
【问题描述】:

当我在重构我的代码时,我像这样重写了一个代码 sn-p

#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 返回全局变量,但调试器的调用堆栈告诉我上面的堆栈帧 outputCallbackrun(如预期的那样)。

我还尝试通过callback(iter, globals()) 在 b 中调用我的回调并将 outputCallback 更改为 def outputCallback(iter, context):,但仍然遇到相同的错误。

我做错了什么?如何简单地捕获 opt.run 中所有定义的变量并将它们转发给我的回调?

提前致谢

【问题讨论】:

  • 请在 b.py 中显示你写 current_mse 的部分 - 到目前为止,你的代码对我来说很好 - 没什么意外

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


【解决方案1】:

模块创建一个命名空间,b.py 中的代码不会看到 a.py 变量,尽管由 a.py 导入。如果它们在同一个模块中并且您只阅读 vars,只需使用它们的名称,它们就会被选中。要编写 var,您需要将它们声明为全局变量。

要获取所有全局变量,这些链接可能会有所帮助(基本上您必须导入它们)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2017-09-20
    • 2020-01-03
    • 1970-01-01
    • 2011-07-17
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多