Python **kwargs不向函数传递变量,什么';怎么了?

Python **kwargs不向函数传递变量,什么';怎么了?,python,Python,出于某种原因,我无法让接收函数看到在Python中**kwargs中传递的变量。(已解决-请参见编辑)。这说明了问题所在,**kwargs参数通过多个函数传递到被积函数。我在里面放了一个印刷品(kwargs),它显示了我在下面的前几行中创建的整个词典。但是被积函数看不到这些变量,它会出错。使这些变量可供最终函数访问的正确方法是什么?非常感谢,在SO上搜索了不少帖子,但找不到与我的案例直接相关的内容 def integrand(x, F, K, T1, T2, vol, flag): pr

出于某种原因,我无法让接收函数看到在Python中**kwargs中传递的变量。(已解决-请参见编辑)。这说明了问题所在,**kwargs参数通过多个函数传递到被积函数。我在里面放了一个印刷品(kwargs),它显示了我在下面的前几行中创建的整个词典。但是
被积函数看不到这些变量,它会出错。使这些变量可供最终函数访问的正确方法是什么?非常感谢,在SO上搜索了不少帖子,但找不到与我的案例直接相关的内容

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)
这就是出错前打印的内容
打印(kwargs)

和错误,尽管上面定义了K:

NameError: name 'K' is not defined

解决方案是定义每个输入,而不是从字典中提取每个值。。。传递给最后一个函数的
**kwargs
自动提取所有关键字参数。

**kwargs
作为
dict
传递给函数,它不会自动填充函数的局部变量

e、 g:


mgilson的答案很完美,我已经结束了这篇类似文章的重复,并提供了更多详细信息。尝试添加
K=kwargs['K']
,等等。作为旁注,如果你想获取像
K
这样的特定参数,那么就获取这些特定参数:
def被积函数(x,F,K,T1,T2,vol,flag):…
您仍然可以将它们作为关键字传递,但不必担心
**
机制。(也可以指定部分/全部的默认值)更简单的方法是在上面的
被积函数中定义每个变量,而不是接受
**kwargs
作为输入,然后将
**kwargs
传递给该函数,它将解压关键字,无需从字典中逐个提取每个值。这就是我一直在寻找的答案@马特——是的,那样肯定更容易。:)
NameError: name 'K' is not defined
kwargs = {'K': 1}

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

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

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