访问if __name__ ==“main”中的变量

时间:2012-05-06 23:48:58

标签: python variables 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会将其添加到本地范围中,但即使使用全局值也无法修复它。我该如何解决这个问题?

1 个答案:

答案 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__"块内数据的另一个模块的数据。因为现在您假设它将始终用作入口点(从不通过其他东西导入),并且您开始对代码施加限制。