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:比较两个类。经过一系列测试,valueChange 设置为 True,使用此代码删除一个值

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

测试检查.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()

其他模块.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 回答