在 if 中访问变量 __name__ == "main"



>我有一个程序,可以在一系列测试中比较两个类。

主程序(称为 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__"块内数据的另一个模块的数据。因为现在你假设它将始终用作入口点(永远不会被其他东西导入(,并且你开始对你的代码施加限制。

相关内容

  • 没有找到相关文章

最新更新