出于某种原因,我无法通过接收函数看到Python中** kwargs中传递的变量。 (已解决 - 请参阅编辑)。这说明了问题 - ** kwargs参数通过几个函数传递给integrand
函数。我在那里放了一个印刷品(kwargs),它显示了我在下面几行中创建的整个字典。但是integrand
函数没有看到这些变量并且它出错了。使这些变量可以访问最终函数的正确方法是什么?非常感谢,在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)
这是在错误输出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
解决方案是定义每个输入而不是从字典中提取每个值...传递给last函数的**kwargs
会自动提取所有关键字参数。
答案 0 :(得分:1)
**kwargs
作为dict
传递给该函数,它不会自动填充函数的本地人。
e.g:
kwargs = {'K': 1}
def foo(**kwargs):
print(K)
def bar(**kwargs):
print(kwargs['K'])
foo(**kwargs) # NameError
bar(**kwargs) # Works Ok.