我正在讀一本關於該Python的全球聲明("Python scope"),我在回憶,我怎麼經常使用這一說法時,我是一個Python初學者(我用全球很多),以及如何,如今,年後,我根本不使用它。我甚至認爲它有點「非pythonic」。
你在Python中使用「全局」語句嗎?
你用在Python這種說法?您的使用情況是否隨時間變化?
我正在讀一本關於該Python的全球聲明("Python scope"),我在回憶,我怎麼經常使用這一說法時,我是一個Python初學者(我用全球很多),以及如何,如今,年後,我根本不使用它。我甚至認爲它有點「非pythonic」。
你在Python中使用「全局」語句嗎?
你用在Python這種說法?您的使用情況是否隨時間變化?
我從來沒有在我3年以上的專業人士使用的Python和五年以上爲Python愛好者在任何生產代碼語句中的合法使用。我需要改變的任何狀態都存在於類中,或者如果存在某種「全局」狀態,它就會像全局緩存那樣處於某種共享結構中。
一次或兩次。但重構始終是一個很好的起點。
如果我能避免它,沒有。而且,據我所知,總有一種方法可以避免它。但我不是說,它是完全無用要麼
對象是具有非本地狀態的首選方式,讓全球很少用到。我不認爲即將到來的非本地修改器會被廣泛使用,我認爲它主要是爲了讓lispers停止抱怨:-)
在我看來,只要你覺得需要在python中使用全局變量代碼,現在是停下來研究代碼重構的好時機。
代碼把global
和拖延,如果你的死線接近重構過程聽起來很有希望,但相信我,你不會再回到這個和修復,除非你真的要 - 就像你的代碼停止出於某種奇怪的原因工作,你必須調試它,你會遇到一些變量,他們所做的一切都是搞砸了。
所以,說實話,即使是允許的,我儘可能避免使用它。即使這意味着圍繞您的代碼片段構建簡單的類。
我避免它,我們甚至有一個pylint規則,禁止它在我們的生產代碼。我相信它根本不應該存在。
我使用「全球」的背景下,如本:
_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
很少。我還沒有找到它的用途。
它可以在共享狀態的線程中使用(使用鎖定機制)。
但是,我很少使用它。
我用它快速&髒,一次性使用腳本來自動完成一些一次性的任務。任何比這更大的東西,或者需要重用的東西,我會找到更優雅的方式。
我使用它與命令行腳本和「optparse」全局選項:
我的主要()解析這些參數,並將那些無論函數做腳本的工作......但寫供應全球「選擇」字典的選項。
Shell腳本選項通常會調整'葉'行爲,並且通過每個參數列表對'opts'字典進行線程處理是不方便的(並且不必要)。
我已經在一個函數創建或設置全局使用的變量的情況下使用它。下面是一些例子:
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
我傾向於使用裝飾模塊的「memoize的」功能在這樣的情況下,但我不能指責你的全球使用的清晰度:) – 2008-09-29 06:06:52