2017-10-13 66 views
1

我對Python編程語言相當陌生,我期待更深入地瞭解字典理解是如何工作的(如果這實際上是第一位的話!)Python字典理解預執行方法

return { 
    'hello': method_call_1() 
    'goodbye': method_call_2() 
    'hello2': method_call_3() 
}['hello'] 

見到這種情景,我會假設,method_call_1()將被執行,因爲這是字典的鍵返回尋找。然而,在我的程序中,似乎另外兩個方法被執行(或者我因爲缺少它們而出錯),無論它們是否被返回。

這是標準行爲嗎?我唯一的假設是python編譯器會在實際使用之前預先執行方法調用,而不是隻執行所選擇的方法。

關閉我的頭頂,我大概可以解決這個問題的東西,如:

x = return { 
    'hello': 'method_call_1' 
    'goodbye': 'method_call_2' 
    'hello2': 'method_call_3' 
}['hello'] 

x() 

但這似乎是不恰當的做法,有沒有更好的方式去這件事嗎?

+0

首先你構建字典。爲了構建它,提供這些值的函數必須被執行。 – Matthias

回答

2

當生成字典時,Python想要存儲每個表達式的結果值,因此在字典中調用的每個函數都將在生成過程中進行評估,而不是在調用過程中進行評估。

如果您只打算將函數存儲在那裏以便稍後調用它們,則可以存儲該函數的內存地址。也就是沒有括號的函數的名字。

這樣,你可以叫他們以後ASI你試圖在第二個代碼塊來做:

x = return { 
    'hello': method_call_1, 
    'goodbye': method_call_2, 
    'hello2': method_call_3, 
}['hello'] 

x() 
+0

這工作,最終使用getattr,因爲該方法是在一個模塊中,但這是一般的實現。謝謝! :) – user3062123

0

蟒蛇編譯器實際上是想既然你打電話給他們(())執行方法,因此,這個函數的返回值被賦值給字典的值。

你可以做這樣的事情:

def func_1(): 
    return 1 
def func_2(): 
    return func_1 
def func_3(): 
    return func_1() 

def select_funct(i): 

    selection = {1: func_1, 
       2: func_2, 
       3: func_3(), 
       } 
    return selection[i] 

print(select_funct(1)()) 

print(select_funct(2)()()) 

print(select_funct(3))