2012-05-06 52 views
2

我有一個程序比較一系列測試中的兩個類。訪問一個變量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會將其添加到本地範圍中,但即使使用全局值也不能解決問題。我將如何去解決這個問題?

+5

如果您將initial.py導入到另一個模塊中,if __name__ ==「__main __」:'塊之下的任何內容都將不再執行。 –

+1

另外,這聽起來像你正試圖設置循環進口?你的模塊知道主入口點? – jdi

+0

使用'if ... is True'是進行額外工作,減少代碼清晰度,並且有時會導致錯誤的好方法。只要使用'if ...'。 –

回答

4

這似乎是一個設計問題。你似乎正在設置循環進口,如果可能的話應該避免。如果你以後有什麼是要共享你的包模塊全局狀態,你可能想使你的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__"塊中的數據的模塊的數據。因爲現在你正在假設它將始終用作入口點(從來不會被其他東西導入),並且你開始對代碼進行限制。