0

奇妙な問題があります。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))

ありがとうございました!

4

3 に答える 3

4

あなたはでコードを呼んでいます

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

2番目のパラメーターにはキーワードがないため、インタープリターはこれがパラメーターであると想定することに注意してdataください(これは、関数で定義されている順序であるため)。追加label=すれば解決するはずです。

ただし、コードにはもっと重要なエラーがあります。デフォルト値として[]を使用しないでください。その理由は、このコードが関数定義時に評価されるためです。dataパラメータなしでこのコードを呼び出すたびに、デフォルト値と同じリストが表示されます。そして、それは最初の後に空ではないかもしれません!これは、すべての可変データ型に当てはまります。これを行う正しい方法はNone、デフォルト値として使用し、パラメーター値がNoneの場合、関数(毎回実行されるコード)内で新しい[]を初期化することです。(このgochaは、デフォルトのパラメーター値で、David Goodgerによってもよく説明されています)

于 2010-02-10T10:14:46.070 に答える
4

2番目のバージョン(def __init__(self, sample_rate, data=[], label=u""):)では、2番目の位置引数(呼び出された場合、カウントされないことを意味しますself)はですdataが、__getslice__では、渡す2番目の引数はですlabel。したがって、ラベルを2番目の引数として保持するか、関数呼び出しを次のように変更する必要があります。

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

問題は、呼び出し元のコードに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は、定位置引数とキーワード引数の両方によってバインドされます。それ以外の場合は、2番目の位置引数がに使用され、キーワード引数のみを取得するためlabel、機能します。data

于 2010-02-10T10:16:28.460 に答える