2

一連のテストで 2 つのクラスを比較するプログラムがあります。

メイン プログラム (initial.py と呼ばれる) は、両方の値を辞書に割り当てます。

import testcheck

values = {}
valueChange = False

if __name__ == "__main__":
    values['valueOne'] = testcheck.assignValue()       #see note 1
    values['valueTwo'] = testcheck.assignValueTwo()    
    testcheck.checkValues()                            #see note 2

    while valueChange is True :
        values['valueTwo'] =   testcheck.assignValueTwo()
        testcheck.checkValues()

注 1: これらはどちらも同じクラスを返しますが、値は異なります。

注 2: 2 つのクラスを比較します。一連のテストの後、valueChange が True に設定され、このコードを使用して 1 つの値が削除されます

import initial

...

if initial.valueChange is True:
   del initial.values['valueTwo']

...

これはエラーを返します

del initial.values['valueTwo']
KeyError: 'valueTwo'

valueOne と valueTwo を追加するとローカルスコープに追加されるためだと思いましたが、グローバル値を使用しても修正されません。これを解決するにはどうすればよいですか?

4

1 に答える 1

4

これは設計上の問題のようです。可能であれば避けるべき循環インポートを設定しているようです。testcheckパッケージのモジュール間でグローバルな状態を共有したい場合は、モジュールのグローバル変数ではなく、モジュール内に状態を保存することを利用したい場合があります。initial.py

testcheck.py

# module globals
_TEST_VALUES = {}
valueChanged = False

...

def getTestValue(name):
    return _TEST_VALUES.get('name', None)

def assignValue():
    # do stuff
    result = 'foo'
    _TEST_VALUES['valueOne'] = result
    return result

def assignValueTwo():
    # do stuff
    result = 'bar'
    _TEST_VALUES['valueOne'] = result
    return result

...

初期.py

testcheck.assignValue()     
testcheck.assignValueTwo()    
testcheck.checkValues()                          

while testcheck.valueChange:
    testcheck.assignValueTwo()
    testcheck.checkValues()

otherModule.py

import testcheck

...

if testcheck.valueChange:
    try:
        del initial.values['valueTwo']
    except KeyError:
        pass

...

実際の使用に関して、この全体がどこに向かっているのか、私にはわかりません。しかし、おそらくこれで、どこから始めればよいかがわかります。intial.py エントリ ポイントをインポートする他のモジュールの循環インポートはなくなりました。testcheck モジュール内にすべてのグローバルを格納しています。この例は非常に迅速で汚いです。説明するだけです。

if __name__ == "__main__"どのモジュールも、ブロック内のデータを処理する別のモジュールのデータにアクセスしようとするべきではありません。これは、常にエントリ ポイントとして使用される (他の何かによってインポートされることはない) という仮定を立てており、コードに制限を加え始めているためです。

于 2012-05-07T00:12:34.153 に答える