【问题标题】:accessing a variable in if __name__ == "main"访问 if __name__ == "main" 中的变量
【发布时间】:2012-05-15 13:24:50
【问题描述】:

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

主程序(称为 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 会将其添加到本地范围内,但即使使用全局值也无法修复它。我将如何解决这个问题?

【问题讨论】:

  • 如果你将 initial.py 导入另一个模块,if __name__ == "__main__": 块下的任何东西都将不再执行。
  • 另外,听起来您正在尝试设置循环导入?你的模块知道主入口点吗?
  • 使用if ... is True 是做额外工作的好方法,使您的代码不太清晰,有时还会导致错误。只需使用if ...

标签: python variables main


【解决方案1】:

这似乎是一个设计问题。您似乎正在设置循环导入,如果可能的话应该避免。如果您要在包的模块之间共享全局状态,您可能希望利用将状态存储在 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 入口点的其他模块不再循环导入。您将所有全局变量存储在 testcheck 模块中。这个例子非常快速和肮脏。它只是为了说明。

任何模块都不应尝试访问另一个模块的数据,该模块处理if __name__ == "__main__" 块中的数据。因为现在您假设它将始终用作入口点(从不被其他东西导入)并且您开始对代码施加限制。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 2017-05-19
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多