2012-09-05 30 views
0

我有一個動態的Python服務,它將根據每條記錄定義函數,並且我遇到了一些我不太清楚的東西。說我有一個測試程序設置像這樣:多次定義一個函數

func_str = """ 
def func(): 
    print "top" 
""" 
exec func_str 

func_str = """ 
def func(): 
    print "bottom" 
""" 
exec func_str 

func() 

這當然會,打印"bottom",爲exec func_str第二個呼叫覆蓋第一。我很好奇引擎蓋下發生了什麼。第一個函數定義以某種方式被刪除?

+3

哇,這項服務聽起來很可怕。 –

+2

你確定需要'exec'這樣的全部功能嗎?如果有任何共同的功能,你應該認真考慮編寫一個單獨的函數來接受適當的輸入或使用類和繼承來完成工作而不使用'exec',如果最終用戶可以修改任何輸入,這可能是危險的。 –

+0

我知道這聽起來很可怕,但這不是外部/其他用戶訪問的任何東西。 – Valdogg21

回答

5

函數體被編譯,然後它被分配到變量名func下的局部名稱空間。

然後,當您運行第二個exec語句時,將使用該名稱存儲一個新函數,並覆蓋第一個函數。您可以在一個新的名稱保存一個對它的引用保存的第一個:

foo = func 

,所以你以後可以參考它仍然爲foo

foo() 

你也可以將其存儲在字典,列表或另一個對象上的屬性。

2

它是與此相同:

>>> a = 5 
>>> print a 
5 
>>> a = 'hello' 
>>> print a 
'hello' 

換句話說,它只是分配一個函數的名稱(在這種情況下FUNC),並在隨後打電話給你重新分配相同的名稱FUNC爲不同的功能。