2013-03-06 97 views
1

如果我有一些像這樣的代碼:函數是否作爲參數傳遞時進行評估?

def handler(self): 
    self.run(self.connect) 

def connect(self, param): 
    #do stuff... 

def run(self, connector): 
    self.runner = connector 

什麼是先計算當我打電話self.run(self.connect)?

與連接東西的運行中已經做了什麼?或與self.connect連接尚未評估?在你的問題

+0

你試過投入print語句在每個函數的開始? – mbatchkarov 2013-03-06 20:00:15

+0

請注意,當您將它傳遞給'run'時,您不會爲'connect'提供參數。如果調用'connect',你會得到關於缺少參數的錯誤。 – chepner 2013-03-06 20:32:38

回答

6

傳遞函數的參數不叫它:

In [105]: def f1(f): 
    .....:  print 'hi' 
    .....:  return f 
    .....: 

In [106]: def f2(): 
    .....:  print 'hello' 
    .....:  

In [107]: f1(f2) 
hi 
Out[107]: <function __main__.f2> 
當然

,如果你傳遞一個函數調用另一個函數,你正在傳遞的返回值:

In [108]: f1(f2()) 
hello 
hi 

請注意它們的調用順序:首先調用f2,並將其返回值傳遞給f1

2

無代碼的實際調用connect(),因此函數永遠不會被調用。 self.run(self.connect)所做的一切就是讓self.runner成爲self.connect的同義詞。