2017-10-11 38 views
0

我正在編寫一些代碼,其中一些函數需要很多輸入變量。所以,我認爲通過字典使這些輸入變量可調用kwargs是個好主意。我遇到函數kwargs被父函數調用時遇到問題。作爲一個簡單的例子,請考慮下面的代碼。如何將字典項目用作父函數和子函數中的函數kwargs?

import numpy as np 

## generate some data and call function via dict 

def f(x): 
    return np.cos(x) 

data_one = np.linspace(1, 10, 10) # x 
data_two = f(data_one) # y 

xy_dict = dict(x=data_one, y=data_two) ## put x,y into dict 

def try_dict_ops(x, y): 
    c = [x[i] - y[i] for i in range(len(x)) if len(x) == len(y)] 
    return np.array(c) 

print(try_dict_ops(**xy_dict)) 
## prints array, it works 

現在我將介紹一個父函數和相應的數據字典。

abxy_dict = dict(a=1, b=4, x=data_one, y=data_two) 

def try_nested_dict_ops(a, b, x, y): 
    g = [try_dict_ops(x, y)[i] * a + b for i in range(len(x))] 
    return np.array(g) 

print(try_nested_dict_ops(**abxy_dict)) 
## prints array, it works 

我的問題是關於調用父函數的不同方法,該方法依次調用上面定義的子函數。沒有明確將xy置於abxy_dict之內嗎?此外,如果一個父函數調用兩個不同的子函數(這兩個子函數共享kwargs名稱但不一定是參數值),我的目標是否仍然有可能得到這樣的設置?

回答

2

使用字典傳遞關鍵字參數只是調用函數的不同拼寫。 對於函數本身並不重要,它會以某種方式得到這些參數。

換句話說,功能並不關心如果使用

xy_dict = dict(x=data_one, y=data_two) 
try_dict_ops(**xy_dict) 

try_dict_ops(x=data_one, y=data_two) 

try_dict_ops(data_one, data_two) 

如果你的函數實際上不需要訪問xy(s Ø通過他們的唯一目的是傳授他們的傳遞函數調用),那麼剛剛捕獲這些參數在**kwargs包羅萬象:

def try_nested_dict_ops(a, b, **kwargs): 
    g = [try_dict_ops(**kwargs)[i] * a + b for i in range(len(x))] 
    return np.array(g) 

現在所有額外關鍵字參數傳遞給try_nested_dict_ops()傳遞在調用try_dict_ops()時,函數本身不需要知道這些參數是什麼。您可以將其用於多個函數調用。

然後,您需要xy作爲關鍵字參數傳遞,而不是位置參數。

+0

非常有用,謝謝!作爲一個快速拋開,功能是否有可能從多個字典中調用kwargs? – mikey

+0

@mikey再次,不要混淆用於調用和定義函數參數的類似語法。從Python 3.5開始,您可以在調用中使用'** name'指定多個字典。所有鍵值組合都傳遞給函數。如果它明確命名了參數和/或全部參數,則取決於函數。 –

相關問題