Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交换两个关键字参数的位置会引发错误_Python_Keyword Argument - Fatal编程技术网

Python 交换两个关键字参数的位置会引发错误

Python 交换两个关键字参数的位置会引发错误,python,keyword-argument,Python,Keyword Argument,我有个奇怪的问题。我知道在Python中,kwargs跟随args,所以我检查了这一点,这不是问题所在。问题是: 罚款: def\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu TypeError:\uuuuu init\uuuuu()为关键字参数“data”获取了多个值: def\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我有个奇怪的问题。我知道在Python中,kwargs跟随args,所以我检查了这一点,这不是问题所在。问题是:

罚款:

def\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

TypeError:
\uuuuu init\uuuuu()
为关键字参数“data”获取了多个值:

def\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

引发错误的呼叫线路如下所示:

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))

谢谢大家!

您正在使用调用代码

Channel(self.sample_rate, self.label, data=list.__getslice__(self,start,stop))
请注意,第二个参数没有关键字,因此解释器假定这是
数据
参数(因为这是它们在函数中定义的顺序)。如果您添加
label=
,它应该会解决这个问题

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

在第二个版本中(
def\uu init\uuuuuuuuuuuuuuu(self,sample\u rate,data=[],label=u)”):
),第二个位置参数(调用时,意味着不计算
self
)是
数据,但在
\uuuuu getslice\uuuuuuu>,传递的第二个参数是
label
。因此,您应该将label保留为第二个参数,或者将函数调用更改为:

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

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

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

在Python2.x中,函数定义中的位置参数和关键字参数之间没有区别。调用函数时,函数调用中的位置参数用于从左到右填充参数,然后绑定所有关键字参数。在您的例子中,
数据
由位置参数和关键字参数绑定。它在另一种情况下工作,因为第二个位置参数用于
label
,而
data
只获取关键字参数。

Bah!这是为什么我不应该在凌晨4点编码的一个主要例子。谢谢大家费心去捕捉我愚蠢的错误。