我有一个程序可以在一系列测试中比较两个类。
主程序(称为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
模块中,而不是存储在 的全局变量中初始.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__"
block 中数据的模块的数据。因为现在您假设它将始终用作入口点(永远不会被其他东西导入),并且您开始对代码施加限制。
关于python - 访问 if __name__ == "main"中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475271/