title: **kwargs not passing variables to function, what's wrong?
body: <p>For some reason, I can't get the variables passed in **kwargs in Python to be seen by the receiving function.  (RESOLVED - see edit).  This illustrates the problem - the **kwargs parameters are passed through several functions and make it to the <code>integrand</code> function.  I put a print(kwargs) in there which displays the whole dictionary I created in the first few lines below.  BUT these variables aren't seen by the <code>integrand</code> function and it errors out.  What is the correct way to make these variables accessable to the final function?  Much appreciated, searched quite a few posts on SO but couldn't find something directly relevant to my case. </p>
  
  <pre><code>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)
  </code></pre>
  
  <p>And this is what is printed before it errors out <code>print(kwargs)</code>:</p>
  
  <pre><code>{'F': 1.2075, 'flag': -1.0, 'K': 0.12509999999999999, 'T2': 0.068500000000000005, 'vol': 0.42999999999999999, 'T1': 0.041099999999999998}
  </code></pre>
  
  <p>And the error, despite K being defined above:</p>
  
  <pre><code>NameError: name 'K' is not defined
  </code></pre>
  
  <p>The solution was to define each input rather than extract each value from the dictionary...  The <code>**kwargs</code> passed to the last function extracts all the keyword arguments automatically.</p>