2016-01-17 3 views
2

Я пытаюсь вычислить количество элементов в химическом уравнении. Отладчик, который я создал, как-то не работает с внешними переменными. Я не уверен, как использовать глобальные переменные в этой ситуации.KeyError: глобальный недоступен через внешний класс

EDIT: Отладчик должен указывать имя переменной, а затем ее значение. Что я могу изменить для доступа к переменным в моей основной программе через отладчик?

EDIT: Существует ключевая ошибка с carrots, если я не принимаю left.

Debug.py в site-packages:

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 

Chemical_Balancer.py:

from Debug import Debugger 

def directions(): 
    print 'Welcome to the chem Balancer.' 
    print 'Use the following example to guide your work:' 
    global left #LEFT IS GLOBAL 
    left = 'B^6 + C^2 + B^3 + C^3 + H^9 + O^4 + Na^1' 
    print left 
    print "#Please note to use a 'hat' when entering all elements" 
    print '#use only one letter elements for now' 
#left = raw_input('enter formula:') #enter formula to count 
directions() 

chem_stats = {} 
chem_names = [] 
chem_names = [] 
chem_indy = [] 

for c in range(len(left)): 
    if left[c].isalpha() and left[c].isupper(): 
     chars = '' 
     if left[c+1].islower(): 
      chars += left[c]+left[c+1] 
     else: 
      chars += left[c] 
     #print chars 
     chem_indy.append(c) 
     chem_names.append(chars) 

carrots = [x for x in range(len(left)) if left[x]=='^'] 

#print chem_names 

#chem_names = [left[c] for c in range(len(left)) if left[c].isalpha() and left[c].isupper()] 
#chem_indy = [c for c in range(len(left)) if left[c].isalpha() and left[c].isupper()] 

debug = Debugger(['carrots','chem_names','chem_indy','chem_stats']) #WITHOUT LEFT 
debug.show() 

Сообщение об ошибке:

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] #EDIT 
    File "<string>", line 1, in <module> 
KeyError: 'carrots' #EDIT 
+0

Почему вы используете eval()? (Я не спрашиваю, потому что это неправильно, просто интересно, почему он используется.) –

+0

Чтобы найти значение переменной. –

+0

Да, я пробовал несколько вещей с eval() Я думаю, что я найду документы на нем –

ответ

0

О конкретной ошибке на left переменной:

, когда вы говорите, что переменная является глобальной, python знает, что она должна искать ее в глобальном пространстве имен, когда ее имя используется. Но в коде left не было назначено в таком пространстве имен.

Как вы можете видеть, left закомментирована

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

Раскоментируйте это путем удаления # в начале строки, так что линия внутри функции directions

global left 

можно найти и последующие инструкции могут работать.

О реализации: одно решение, позволяющее отладчику знать, где искать переменные, то есть в каком модуле можно указать имя модуля, когда оно создано. Тогда объект отладчик может достигнуть глобальных переменных модуля, который создал его с помощью sys.modules[module_name].__dict__

debugger.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] 

chemical_balancer.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 информативным и полезным.

+0

Он находится в направлениях: «глобально слева, слева =« B^6 + C^2 + B^3 + C^3 + H^9 + O^4 + Na^1''. –

+0

Я добавил пример использования кода, чтобы показать вам, что он работает – Pynchia

+0

Я понимаю, и это работает, но я импортирую модуль из другого места. Отдельный класс не знает globals(). –

Смежные вопросы