2009-01-30 105 views
11

我是python的新手,所以請原諒可能是一個非常愚蠢的問題。python中的全局變量混淆

基本上,我有一個名爲_debug的全局變量,它用於確定腳本是否應該輸出調試信息。我的問題是,我不能將它設置爲與使用它不同的python腳本。

我有兩個腳本:

one.py: 
------- 

def my_function(): 
    if _debug: 
    print "debugging!" 


two.py: 
------- 

from one import * 
_debug = False 

my_function() 

運行two.py產生一個錯誤:

NameError: global name '_debug' is not defined 

誰能告訴我什麼,我做錯了什麼?以下劃線開始

回答

16

還有更多的問題,恐怕不僅僅是領先的下劃線。

當您撥打my_function()時,它的名稱空間中仍然不會有debug變量,除非您從two.py導入它。

當然,這樣做意味着您最終會得到循環依賴關係(one.py -> two.py -> one.py),您將得到NameError s,除非您重構導入和聲明各種東西的地方。

一個解決方案是創建一個簡單的第三個模塊,它定義這樣的「常量」,這可以從任何地方安全地進口,如:

constants.py 
------------ 
debug = True 

one.py 
------ 
from constants import debug 
#... 

two.py 
------ 
from constants import debug 
#... 

不過,我只想使用內置的logging推薦這個模塊 - 爲什麼不呢?它配置簡單,使用更簡單,可靠,靈活且可擴展。

5

名稱可能與

from one import * 
+1

這是因爲他們的意思是「這是內部的東西,不要觸摸它,或者這樣做是在你自己的風險」。 – 2009-01-30 14:00:09

+0

我真的感到震驚的是,一個完全不正確的答案已被接受並投票贊成如此之高。 – 2009-01-30 14:02:09

4

進口也可以使用__debug__變量進行調試。如果解釋器沒有用-O選項啓動,這是事實。 assert語句也可能有幫助。

1

更多解釋:功能my_function的名稱空間始終位於模塊one中。這意味着當在my_function中找不到名稱_debug時,它在one中查找,而不是調用該函數的命名空間。雪花石膏的答案提供了一個很好的解決方案。