2016-05-31 74 views
1

由於某些原因,我無法獲得通過接收函數可以看到Python中的** kwargs傳遞的變量。 (已解決 - 請參閱編輯)。這說明了這個問題 - ** kwargs參數通過幾個函數傳遞,並且使其成爲integrand函數。我在那裏放了一個印刷品(kwargs),它顯示了我在下面頭幾行創建的整個字典。但是這些變量在integrand函數中看不到,並且出錯。使這些變量可訪問最終函數的正確方法是什麼?非常感謝,搜索了不少帖子,但找不到與我的案件直接相關的東西。** kwargs沒有將變量傳遞給函數,怎麼回事?

def integrand(x, F, K, T1, T2, vol, flag): 
    print(kwargs) 
    d1 = (np.log(x/(x+K)) + 0.5 * (vol**2) * (T2-T1))/(vol * np.sqrt(T2 - T1)) 
    d2 = d1 - vol*np.sqrt(T2 - T1) 
    mu = np.log(F) - 0.5 *vol**2 * T1 
    sigma = vol * np.sqrt(T1) 
    value = lognorm.pdf(x, scale=np.exp(mu), s=sigma) * (flag * x*norm.cdf(flag * d1) - flag * (x+K)*norm.cdf(flag * d2)) 
    return value 

def integrate(x, w, a, **kwargs): 
    return np.sum(w*transform_integral_negative1_1_to_0_1(x, a, **kwargs)) 

def transform_integral_0_1_to_Infinity(x, a, **kwargs): 
    return integrand(a+(x/(1-x)), **kwargs) *(1/(1-x)**2); 

def transform_integral_negative1_1_to_0_1(x, a, **kwargs): 
    return 0.5 * transform_integral_0_1_to_Infinity((x+1)/2, a, **kwargs) 

flag = current_opt[i,0] 
F = current_opt[i,1] 
K = current_opt[i,2] 
T2 = current_opt[i,3] 
T1 = current_opt[i,4] 
r = current_opt[i,5] 
vol = current_opt[i,6] 

a = 0 
b = np.Inf 
kwargs = {'flag':flag, 'F':F, 'K':K, 'vol':vol, 'T2':T2, 'T1':T1} 
integrate(x, w, a, **kwargs) 

,這是它的錯誤出print(kwargs)之前什麼被印刷:以上限定

{'F': 1.2075, 'flag': -1.0, 'K': 0.12509999999999999, 'T2': 0.068500000000000005, 'vol': 0.42999999999999999, 'T1': 0.041099999999999998} 

和誤差,儘管K:

NameError: name 'K' is not defined 

的解決方案是定義每個輸入而不是從字典中提取每個值...傳遞給最後一個函數的**kwargs會自動提取所有關鍵字參數。

+0

mgilson的答案是完美的,我已經關閉了這是一個類似的帖子有更多細節的欺騙。 –

+0

嘗試添加'K = kwargs ['K']'等等 –

+0

作爲一個附註,如果你想採取像K這樣的具體參數,那麼採取那些特定的參數:'def integrand(x,F,K,T1, T2,vol,flag):......你仍然可以將它們作爲關鍵字傳遞,但不必擔心** **機制。 (也可以指定一些/所有的默認值) –

回答

1

**kwargs作爲dict傳遞給函數,它不會自動填充函數的本地。

例如爲:

kwargs = {'K': 1} 

def foo(**kwargs): 
    print(K) 

def bar(**kwargs): 
    print(kwargs['K']) 

foo(**kwargs) # NameError 
bar(**kwargs) # Works Ok. 
+0

更簡單的方法是在上面的'integrand'函數中定義每個變量,而不是接受'** kwargs'作爲輸入,然後通過'** kwargs'到那個函數,它將解壓關鍵字,不需要從字典1中提取每個值1。這就是我正在尋找的答案! – Matt

+0

@Matt - 是的,絕對更容易。 :) – mgilson