1

化学式の要素数を計算しようとしています。私が作成したデバッガーは、私のプログラム内のグローバルにアクセスできません。具体的には、アクセスしようとしていますcarrotsleft、スタックに追加されていません。何か案は?

Debug.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

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]=='^']

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

1 に答える 1

0

left変数の特定のエラーについて:

変数がグローバルであると言うと、Python は、その名前が使用されるときにグローバル名前空間でそれを検索する必要があることを認識しています。しかし、コードleftではそのような名前空間に割り当てられていません。

ご覧のとおり、leftコメントアウトされています

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

行の先頭にある を削除してコメントを解除します。そのため、関数#内の行directions

global left

それを見つけることができ、次の手順が機能します。

実装について: デバッガーが変数を探す場所 (つまり、どのモジュール) を認識できるようにする 1 つの解決策は、作成時にモジュールの名前を提供することです。次に、デバッガー オブジェクトは、それを作成したモジュールのグローバル変数に到達できます。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ご覧のとおり、デバッガーはメソッドが呼び出されるたびに変数の現在の値を出力します。

この SO Q&Aは参考になり、役に立ちました。

于 2016-01-17T18:59:01.947 に答える