KeyError:无法通过导入的类访问全局

2024-04-19 17:03:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算化学方程式中元素的数量。我创建的调试器无法访问程序中的全局变量。具体地说,我试图访问carrots,但是left没有被添加到堆栈中。有什么想法吗?在

调试.py

class Debugger(object):
    def __init__(self,objs):
        assert type(objs)==list, 'Not a list of strings'
        self.objs = objs
    def __repr__(self):
        return '<class Debugger>'
    def show(self):
        for o in self.objs:
            print o,globals()[o] #EDIT

化学_平衡器.py

^{pr2}$

错误消息:

Traceback (most recent call last):
  File "C:\Python27\#Files\repair\Chemical_Balancer.py", line 38, in <module>
    debug.show()
  File "C:\Python27\lib\site-packages\Debug.py", line 12, in show
    print o,globals()[o]
  File "<string>", line 1, in <module>
KeyError: 'carrots'

Tags: inpyselfdefshowlinedebuggerlist
1条回答
网友
1楼 · 发布于 2024-04-19 17:03:21

关于left变量的特定错误:

当你说一个变量是全局变量时,python知道它必须在全局名称空间中查找它。但是在代码中,^{没有在这样的命名空间中赋值。在

如您所见,left被注释掉了

#left = raw_input('enter formula:')  #enter formula to count

通过删除行开头的#来取消注释,因此directions函数中的行

^{pr2}$

可以找到它,下面的说明可以工作。在

实施情况: 允许调试器知道在何处查找变量(即在哪个模块中)的一个解决方案是在创建模块时向其提供模块的名称。然后调试器对象可以通过sys.modules[module_name].__dict__访问创建它的模块的全局变量

调试器.py

import sys
class Debugger(object):
    def __init__(self, module_name, objs):
        assert type(objs)==list,'Not a list of strings'
        self.objs = objs
        self.module_name = module_name
    def __repr__(self):
        return '<class Debugger>'
    def show(self):
        for o in self.objs:
            print o, sys.modules[self.module_name].__dict__[o]

化学_平衡器.py

import debugger as deb
a = 1
b = 2
d = deb.Debugger(__name__, ['a', 'b'])
print(d.objs)
d.show()
a = 10
b = 20
d.show()

产生

['a', 'b']
a 1
b 2
a 10
b 20

如您所见,调试器每次调用其show方法时都会打印变量的当前值

我发现this SO Q&A信息丰富,很有帮助。在

相关问题 更多 >