Python 交换两个关键字参数的位置会引发错误
我有个奇怪的问题。我知道在Python中,kwargs跟随args,所以我检查了这一点,这不是问题所在。问题是: 罚款:Python 交换两个关键字参数的位置会引发错误,python,keyword-argument,Python,Keyword Argument,我有个奇怪的问题。我知道在Python中,kwargs跟随args,所以我检查了这一点,这不是问题所在。问题是: 罚款: def\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu TypeError:\uuuuu init\uuuuu()为关键字参数“data”获取了多个值: def\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
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点编码的一个主要例子。谢谢大家费心去捕捉我愚蠢的错误。