2008-09-28 23 views
60

我正在讀一本關於該Python的全球聲明("Python scope"),我在回憶,我怎麼經常使用這一說法時,我是一個Python初學者(我用全球很多),以及如何,如今,年後,我根本不使用它。我甚至認爲它有點「非pythonic」。
你在Python中使用「全局」語句嗎?

你用在Python這種說法?您的使用情況是否隨時間變化?

回答

15

我從來沒有在我3年以上的專業人士使用的Python和五年以上爲Python愛好者在任何生產代碼語句中的合法使用。我需要改變的任何狀態都存在於類中,或者如果存在某種「全局」狀態,它就會像全局緩存那樣處於某種共享結構中。

1

一次或兩次。但重構始終是一個很好的起點。

0

如果我能避免它,沒有。而且,據我所知,總有一種方法可以避免它。但我不是說,它是完全無用要麼

3

對象是具有非本地狀態的首選方式,讓全球很少用到。我不認爲即將到來的非本地修改器會被廣泛使用,我認爲它主要是爲了讓lispers停止抱怨:-)

8

在我看來,只要你覺得需要在python中使用全局變量代碼,現在是停下來研究代碼重構的好時機。
代碼把global和拖延,如果你的死線接近重構過程聽起來很有希望,但相信我,你不會再回到這個和修復,除非你真的要 - 就像你的代碼停止出於某種奇怪的原因工作,你必須調試它,你會遇到一些變量,他們所做的一切都是搞砸了。

所以,說實話,即使是允許的,我儘可能避免使用它。即使這意味着圍繞您的代碼片段構建簡單的類。

2

我避免它,我們甚至有一個pylint規則,禁止它在我們的生產代碼。我相信它根本不應該存在。

54

我使用「全球」的背景下,如本:

_cached_result = None 
def myComputationallyExpensiveFunction(): 
    global _cached_result 
    if _cached_result: 
     return _cached_result 

    # ... figure out result 

    _cached_result = result 
    return result 

我使用「全球」,因爲它是有道理的,是清楚發生了什麼功能的閱讀器。我也知道有這樣的模式,這是相當的,但對讀者的認知負擔更重:

def myComputationallyExpensiveFunction(): 
    if myComputationallyExpensiveFunction.cache: 
     return myComputationallyExpensiveFunction.cache 

    # ... figure out result 

    myComputationallyExpensiveFunction.cache = result 
    return result 
myComputationallyExpensiveFunction.cache = None 
+15

我傾向於使用裝飾模塊的「memoize的」功能在這樣的情況下,但我不能指責你的全球使用的清晰度:) – 2008-09-29 06:06:52

2

很少。我還沒有找到它的用途。

2

它可以在共享狀態的線程中使用(使用鎖定機制)。

但是,我很少使用它。

2

我用它快速&髒,一次性使用腳本來自動完成一些一次性的任務。任何比這更大的東西,或者需要重用的東西,我會找到更優雅的方式。

3

我使用它與命令行腳本和「optparse」全局選項:

我的主要()解析這些參數,並將那些無論函數做腳本的工作......但寫供應全球「選擇」字典的選項。

Shell腳本選項通常會調整'葉'行爲,並且通過每個參數列表對'opts'字典進行線程處理是不方便的(並且不必要)。

9

我已經在一個函數創建或設置全局使用的變量的情況下使用它。下面是一些例子:

discretes = 0 
def use_discretes(): 
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes" 
    global discretes 
    if using_real_hardware(): 
     discretes = 1 
... 

file1.py: 
    def setup(): 
     global DISP1, DISP2, DISP3 
     DISP1 = grab_handle('display_1') 
     DISP2 = grab_handle('display_2') 
     DISP3 = grab_handle('display_3') 
     ... 

file2.py: 
    import file1 

    file1.setup() 
    #file1.DISP1 DOES NOT EXIST until after setup() is called. 
    file1.DISP1.resolution = 1024, 768 
相關問題