2017-10-09 67 views
1

我已經有一個工作,但在我的oppinion不是一個長腳本的一部分美麗的解決方案。pythonic方法來調用方法取決於變量[解決方案:字典]

我的腳本使用了幾種類似的方法,這些方法相差太遠,無法合併。然而,我想根據給定的變量來調用其中一種方法。

的方法的名稱建立這樣的:

def read_A(): 
    #doing sth 
def read_B(): 
    #doing sth else 
def read_C(): 

現在我想調用這些方法在Python的方式,當信(A,B, C,...)作爲變量給出。

非Python的的解決辦法是:

if var == "A": 
    read_A() 
if var == "B": 
    read_B() ..... 

,我希望能找到一個更Python的解決方案,讓我簡單地調用這些方法是這樣的:

var = "A" 
read_var()  #This would call the method 'read_A()' 

請記上面的代碼只是我希望做的一個圖像,這不是一個可行的例子!

我希望我說清楚我的問題,提前致謝!

+1

用字母作爲鍵和方法創建一個字典作爲值。 –

回答

2

我沒有看到一個問題,只需使用

if var == 'A': 
    read_a() 

,但如果你想使之更「Python化」則可以將變量使用字典映射的方法和執行它的基礎上的結果一個什麼樣的存儲在你的字典裏:

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

switch = {'A': read_a, 'B': read_b} 

case = 'A' 
switch.get(case)() 
>> 'Running method read_a' 
case = 'B' 
switch.get(case)() 
>> 'Running method read_b' 
+0

該代碼的確使用if來工作,但它需要很多,我想知道是否有辦法以優雅的方式縮短它 – yfro

+0

希望這足夠優雅,它應該減少你的代碼行數,如果你有很多if語句 – AK47

1

棒的字典中的功能,並使用字典派遣到所選擇的一個:

read = {'A': read_a, 'B': read_b, 'C': read_c} 
choice = 'A' 
read[choice]() 

在最後一行中,查找與字典中的選擇匹配的函數,然後立即調用它。

1

如果您有許多名爲read_a,read_b ...等的函數,而不是編寫龐大的字典,那麼可以用這種方法來完成。

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

def read_c(): 
    print("running method read_c") 

def read_d(): 
    print("running method read_d") 

............ 
............ 

def read_z(): 
    print("running method read_z") 

def _read_var(var): 
    method = "read_{}".format(var.lower()) 
    try: 
     eval(method)() 
    except NameError: 
     raise NotImplementedError 

var = "A" 
_read_var(var)# will invoke read_a method 
+1

看起來很有趣。會試一試。謝謝! – yfro

1

你可以使用未來建設:

def execute_func(x): 
    return { 
     '0':read_A(), 
     '1':read_B() 
    }[x] 

設置你的變量,而不是 '0' 和 '1' 或更多,並通過你向PARAMS execute_func()。

+1

既執行read_A又執行read_B,它只是返回所選內容的解決方案,您應該從字典中刪除括號並將它們放在'} [x]' – Adirio

+0

後面,我很好奇它爲什麼會這樣做。這真的有幫助 – yfro