2010-10-06 63 views
1

我在一些定義和類中使用了大量變量(主要是因爲我想能夠使用pydev的代碼摺疊功能)。是否有任何構造函數可以用於定義或類,使其變量自動被認爲是全局變量?有沒有辦法使定義或類中的每個變量自動變爲全局變量?


這是我下面的一些設在意見建議後做了一個例子:

來源:

img_globe  = os.path.join(set_img_dir, 'img_globe.png') 
img_help  = os.path.join(set_img_dir, 'img_help.png') 
img_exit  = os.path.join(set_img_dir, 'img_exit.png') 
img_open  = os.path.join(set_img_dir, 'img_open.png') 
img_tutorial = os.path.join(set_img_dir, 'img_tutorial.png') 
img_save  = os.path.join(set_img_dir, 'img_save.png') 
img_site  = os.path.join(set_img_dir, 'img_site.png') 

...(很長很長的列表)

收件人:

varies = {} 
dirList=os.listdir(set_img_dir) 
for fname in dirList: 
    varies[fname.split(".")[0]] = os.path.join(set_img_dir, fname) 
+4

你從中得到什麼好處?這是一個可怕的想法。如果你的程序需要這個,你的架構就會被打破。 – Daenyth 2010-10-06 16:15:01

+0

其中一個原因是我爲了知道它而想知道它。另一個是我希望能夠使用eclipse所具有的代碼摺疊功能(僅適用於類和定義)。即使只是在開發過程中更容易瀏覽代碼的臨時解決方案,我也願意這樣做。 – relima 2010-10-06 16:17:44

+1

全局變量與代碼摺疊有什麼關係? – 2010-10-06 16:21:04

回答

0

儘管您不應該這樣做,但您要尋找的解決方案並不像您想象的那麼簡單,下面是一個非常簡單的示例,說明如何從函數內部採用局部變量並使其成爲全局變量:

def make_locals_globals(): 
    """This is just bad""" 
    foo = 1 
    bar = 2 

    locals_dict = locals() 
    globals_dict = globals() 

    print 'Locals:', locals_dict 

    for varname, varval in locals_dict.items(): 
     print 'Setting global: %s=%s' % (varname, varval) 
     globals_dict[varname] = varval 

if __name__ == '__main__': 
    make_locals_globals() 

    print '\nGlobals:' 
    print 'foo=', foo 
    print 'bar=', bar 
+0

我認爲這是一個簡單的單線問題。除了期待效率方面的一些缺點,我還是很驚訝地從評論中學到這種行爲非常令人沮喪。謝謝你的幫助。 – relima 2010-10-06 16:31:35

+0

你不應該這樣做的原因是因爲它強制要求所有變量都是全局變量。一旦發生這種情況,就很難(如果不是不可能的話)跟蹤哪個操作正在引用哪個變量,並且在本地範圍內覆蓋全局變得非常容易,除非您的變量命名爲OCD。 Python具有截然不同的優化範圍規則,如果你允許它們,它們可以爲你帶來好處。 – jathanism 2010-10-06 16:34:48

+0

你說得對,因爲這個原因,我對變量的命名非常迷戀。我將盡力利用字典。 – relima 2010-10-06 16:37:53