Ошибка смены позиции двух аргументов ключевого слова - PullRequest
0 голосов
/ 10 февраля 2010

У меня странная проблема. Я знаю, что в Python kwargs следуют за args, поэтому я проверил это, и это не проблема. В чем проблема заключается в следующем:

Штраф:

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

TypeError: __init__() получил несколько значений для ключевого аргумента data:

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 10 февраля 2010

Во второй версии (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))
4 голосов
/ 10 февраля 2010

Вы звоните по коду с

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

Обратите внимание, что у второго параметра нет ключевого слова, поэтому интерпретатор предполагает, что это параметр data (потому что это порядок, который они определены в функции). Если вы добавите label=, это должно решить.

Но в вашем коде есть более важная ошибка: Никогда не используйте [] в качестве значения по умолчанию. Причина в том, что этот код оценивается во время определения функции. каждый раз, когда вы вызываете этот код без параметра data, вы получите тот же список, что и значение по умолчанию . и он не может быть пустым после первого раза! Это верно для всех изменяемых типов данных. Правильный способ сделать это - использовать None в качестве значения по умолчанию и внутри функции (код, который запускается каждый раз) инициировать новый [], если значение параметра равно None. (Этот гоча также хорошо объясняется Дэвидом Гуджером в Значения параметров по умолчанию )

2 голосов
/ 10 февраля 2010

Проблема в том, что в вашем коде вызова у вас есть два позиционных аргумента:

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 получает только ключевое слово аргумента.

...