0

我有一个奇怪的问题。我知道在 Python 中,kwargs 遵循 args,所以我检查了它,这不是问题。这是什么问题:

美好的:

def __init__(self, sample_rate, label=u"", data=[] ):

TypeError:__init__()为关键字参数“数据”获取了多个值:

def __init__(self, sample_rate, data=[], label=u""):

引发错误的调用行如下所示:

def __getslice__(self, start, stop):
    return Channel(self.sample_rate, self.label, data=list.__getslice__(self,start,stop))

完整代码:

class Channel(list):
  sample_rate = 0

  def __init__(self, sample_rate, data=[], label=u"" ):
     list.__init__(self,data)
     self.sample_rate = sample_rate
     self.label = label

  @property
  def nyquist_rate(self):
      return float(self.sample_rate) / 2.0

  def __getslice__(self, start, stop):
      return Channel(self.sample_rate, self.label, data=list.__getslice__(self,start,stop))

谢谢!

4

3 回答 3

4

您正在调用代码

Channel(self.sample_rate, self.label, data=list.__getslice__(self,start,stop))

请注意,第二个参数没有关键字,因此解释器假定这是data参数(因为这是它们在函数中定义的顺序)。如果你添加label=它应该解决它。

但是,您的代码中有一个更重要的错误:永远不要使用 [] 作为默认值。原因是此代码在函数定义时进行评估。每次调用不带data参数的代码时,都会得到与默认值相同的列表。第一次之后它可能不是空的!这适用于所有可变数据类型。正确的方法是使用None默认值并在函数内部(每次运行的代码)初始化一个新的 [],如果参数值为 None。(David Goodger 在Default Parameter Values中也很好地解释了这个 gocha )

于 2010-02-10T10:14:46.070 回答
4

在第二个版本 ( def __init__(self, sample_rate, data=[], label=u""):) 中,第二个位置参数(调用时,表示不计算self)是data,但在 中__getslice__,您传递的第二个参数是label。因此,您应该将标签保留为第二个参数,或者将函数调用更改为:

return Channel(self.sample_rate, label=self.label, data=list.__getslice__(self,start,stop))
于 2010-02-10T10:15:17.013 回答
2

问题是在您的调用代码中,您有两个位置参数:

return Channel(self.sample_rate, self.label, data=list.__getslice__(self,start,stop))
#              sample_rate (pos) data (pos)  data (kw)

在 Python 2.x 中,函数定义中的位置参数和关键字参数没有区别。调用函数时,函数调用中的位置参数用于从左到右填充参数,然后绑定所有关键字参数。在您的情况下,data受位置参数和关键字参数的约束。它适用于另一种情况,因为第二个位置参数用于label,并且data只获取关键字参数。

于 2010-02-10T10:16:28.460 回答