>我有一个程序,可以在一系列测试中比较两个类。
主程序(称为 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 会将其添加到本地范围内,但即使使用全局值也无法修复它。我将如何解决这个问题?
这似乎是一个设计问题。您似乎正在设置循环导入,如果可能的话,应避免这样做。如果您想要在包的模块之间共享全局状态,则可能需要将状态存储在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
...
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 入口点。您将所有全局变量存储在测试检查模块中。这个例子非常快速和肮脏。它只是为了说明。
任何模块都不应尝试访问处理if __name__ == "__main__"
块内数据的另一个模块的数据。因为现在你假设它将始终用作入口点(永远不会被其他东西导入(,并且你开始对你的代码施加限制。