這with_default_value
功能是什麼通常稱爲(不準確)的「封閉」(從技術上說,關閉是相當的內功能得到恢復,這裏newfunc
- 見例如here)。更一般地說,with_default_value
是一個高階函數(「HOF」):它將一個函數(func
)作爲參數,它還返回一個函數(newfunc
)作爲結果。
我見過的答案與裝飾概念混淆這一點,並在Python,這絕對不是是的情況下構建 - 尤其是因爲你提到func
經常是內置的,例如int
。裝飾者也是高階函數,但更具體的是:裝飾者返回裝飾的「富集的」,它們的功能參數的版本(其必須是隻參數 - 通過功能/閉合嵌套多一個電平中獲得「與參數裝飾」,通過給予裝飾HOF多個參數不) ,它被重新分配給完全相同的名稱作爲函數參數(因此通常具有相同的簽名 - 使用裝飾否則將非常奇特,非地道,不可讀,等等)。
所以,不要裝飾,這絕對無關的情況下,並專注於newfunc
關閉。詞彙嵌套函數可以引用(儘管不重新綁定)封閉函數的所有局部變量名稱(包括參數名稱,因爲參數是局部變量) - 這就是爲什麼它被稱爲閉包:它是「封閉」這些「自由變量」。在這裏,newfunc
可以參考func
和default
- 確實如此。
高階函數在Python中是非常自然的事情,特別是因爲函數是第一類對象(所以沒有什麼特別的事情需要做,以將它們作爲參數傳遞,將它們作爲函數值返回,或者甚至將它們存儲在列表或其他容器等),函數和其他類型的對象之間沒有名稱空間的區別,僅僅因爲提及的函數等等而沒有自動調用函數(這很難 - 有點難,或者更難,取決於 - 在其他語言中,確實吸引了很多這類的區別)。在Python中,提到一個函數就是 - 提及;只有當函數對象(通過名字或其他名稱引用)後面跟有括號時纔會發生CALL。
這是對所有有這個例子 - 請不要隨意修改你的問題,在這裏評論等,如果有,你留在有關懷疑其他一些具體的方面!
編輯:因此OP在評論中有禮貌地要求提供更多關閉工廠的例子。這裏有一個 - 想象一些抽象的一種GUI工具包的,而你要做的:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
但這不工作的權利 - 在lambda
內i
是後期綁定的,所以在一個時間按鈕被點擊i
的值總是將成爲最後按鈕的指數,無論是點擊哪一個。有多種可行的解決方案,但關閉工廠是一個優雅的可能性:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
在這裏,我們使用了封閉工廠調整的變量綁定時間 - )在一個特定的形式或其他形式,這是一種封閉工廠非常常見的用例。
不應該有像「如果ISMISSING」的空間? – recursive 2009-09-23 02:02:23