【问题标题】:TypeError: p_vinet() takes 2 positional arguments but 4 were givenTypeError: p_vinet() 接受 2 个位置参数,但给出了 4 个
【发布时间】:2017-09-06 11:29:58
【问题描述】:

我正在尝试将参数传递给函数,并且我认为我做对了,但它仍然给出了错误: TypeError: p_vinet() 接受 2 个位置参数,但给出了 4 个

这是我的代码片段,然后我将给出给出错误的部分。

volumeMgO 是一个先前计算的数组,包括:

array([ 7.64798549,  7.67153344,  7.67153344,  7.8068763 ,  7.97288941,
8.14781986,  8.33321177,  8.53118834,  8.74433596,  8.97545339,
9.22826581,  9.50740563,  9.81962839])

params_MgO 是这样的:

params_MgO    = [11.244, 160., 4.0]

vinet函数是:

def p_vinet(v, params):
  """
  This function will calculate pressure from Vinet equation.

  Parameters
  ==========
  v = volume
  params = [V0, K0, K0']

  Returns
  =======
  Pressure calculated from Vinet equation
  """
  f_v = np.power( v/params[0], 1./3.)
  eta = 1.5 * (params[2] - 1.)

  P = 3 * params[1] * ((1 - f_v) / np.power(f_v, 2) ) * np.exp(eta * (1 - 
  f_v))

  return P

最后,斜率函数只是一种简单的求导方式:

def slope(func, x, h, args=()):
  """
  find a slope for function f at point x

  Parameters
  =========
  f = function
  x = independent variable for f
  h = distance along x to the neighboring points

  Returns
  =======
  slope
  """

  rise = func(x+h, *args) - func(x-h, *args)
  run = 2.*h

  s = rise/run

  return s

现在问题来了。当我输入时:

BulkModulus_MgO = np.zeros(volumeMgO.size)
for i in range(volumeMgO.size):
   BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], volumeMgO[i]*0.0001, 
   args=(params_MgO)) 

我收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-116-60467d989bbc> in <module>()
  1 BulkModulus_MgO = np.zeros(volumeMgO.size)
  2 for i in range(volumeMgO.size):
----> 3     BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], 
volumeMgO[i]*0.0001, args=(params_MgO))

<ipython-input-100-618f25e85d34> in slope(func, x, h, args)
 15     """
 16 
---> 17     rise = func(x+h, *args) - func(x-h, *args)
 18     run = 2.*h
 19 

TypeError: p_vinet() takes 2 positional arguments but 4 were given

我不明白。 p_vinet 需要参数 v 和 params,我通过斜率函数中的 x+h 和 x-h 提供 v,params 是一个列表,其中包含 p_vinet 解包的 3 个条目。所以这是2个论点。为什么说我提供 4 个?

抱歉,如果我呈现代码的方式有点令人困惑。我在 jupyter notebook 中编码,所有功能都是分开的。 volumeMgO 是与之前的代码分开计算的,没有问题。

【问题讨论】:

    标签: python arguments typeerror jupyter


    【解决方案1】:

    我们来看这行代码:

    BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], volumeMgO[i]*0.0001, 
       args=(params_MgO))
    

    args 应该是这样的:args=(params_MgO,)(其中有一个元素的元组)而不是 args=(params_MgO)(不是元组,只是 3 个元素的数组),因为在第二种情况下,在 slope() 函数中解包 *args 会给你3 个附加参数(params_MgO 的每个元素)。这就是为什么你在 slope() 函数中有 4 个参数。在第一种情况下,解包会将整个数组作为单个参数提供(如 p_vinet() 函数中的参数)。

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 2021-09-01
      • 2021-08-20
      • 2021-02-02
      • 2021-04-14
      • 2021-10-05
      • 2018-03-07
      • 1970-01-01
      相关资源
      最近更新 更多