我有一个程序可以比较一系列测试中的两个类。
主程序(称为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会将其添加到本地范围中,但即使使用全局值也无法修复它。我该如何解决这个问题?
答案 0 :(得分:4)
这似乎是一个设计问题。您似乎正在设置循环导入,如果可能应该避免。如果你想要的是在包的模块之间共享一个全局状态,你可能想要使用在testcheck
模块中存储状态,而不是在initial.py
<的全局变量中存储状态/ p>
<强> 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
...
<强> initial.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__"
块内数据的另一个模块的数据。因为现在您假设它将始终用作入口点(从不通过其他东西导入),并且您开始对代码施加限制。