2016-07-11 7 views
0

私は関数の辞書を持っています。これらの関数はすべて1つまたは2つのオプションの引数を使います。私はこの辞書を通して反復し、両方の引数を各反復関数に渡し、2番目の引数を無視するために1つの引数しか必要としない関数を持っています。ただし、このような場合、予期しないキーワード引数エラーが発生します。Python3.4 ** kwargs、予期しないキーワードの引数

def getNumFrames(self, **kwargs): 
    return len(self.x) 

def getConcentration(self, **kwargs): 
    if ((not gradient) or (not maxX)): 
     return 0 
    return (gradient/maxX) * self.x[0] 

fields = {'numFrames': getNumFrames, 'concentration': getConcentration} 


for field, fieldFunction in fields.items(): 
     for track in tracks: 
      fieldFunction(object, maxX = 10, gradient = 2) 

この例では、getConcentrationは機能しますが、getFramesはmaxXが予期しないキーワードであると言います。

*私の実際のミニマムコードを含めるように私の記事を編集しました。

+0

問題を示す*実際の*最小のサンプルコードを投稿してください。このコードには構文エラーがあります(func2の定義にコロンがありません)。また、関数内で任意の引数を使うことはできません。それらを 'kwargs'辞書から取得する必要があります。最後に、 'object'のように組み込みの名前をシャドーするのは悪い習慣です。 –

+0

2番目のパラメータを省略可能にして、デフォルト値 'None'が機能しないようにしますか? –

答えて

-1

私はこれについて、オプションの2番目のパラメータを使用して以下のような関数を作成します。

func (obj, a = 0, b = 0): 
    return obj + a + b 
1

このトラブルのすべてを回避するためのより良い方法は、次のパラダイムを使用することです:

def func(obj, **kwargs): 
    return obj + kwargs.get(a, 0) + kwargs.get(b,0) 

これはkwargsは、渡された引数とその値からなる辞書であるという事実を利用しますget()はルックアップを実行し、キーが存在しない場合はデフォルト値を返します。

いつもは、辞書kwargsで名前付き引数にアクセスします。これはあなたの人生をはるかに簡単にします。

関連する問題