2016-07-03 11 views
0

に複数の値を得た私は、値の範囲を超える機能をマッピングするためにfunctoolsモジュールから部分的方法を使用しています:ここでfunctools.partial:TypeError例外:キーワード引数

def basic_rule(p,b,vx=1,**kwargs): 
    return (p/b) if vx != 0 else 0 

def rule5(func,**kwargs): 
    vals = map(functools.partial(func,**kwargs), range(1,kwargs['b']+1)) 
    return [x for i,x in enumerate(vals[:-1]) if x >= vals[i+1]] == [] 

rule5(basic_rule,p=100,b=10000) 

は、私はラインに乗るエラーです5:functools.partialは、私はすでにそれに値を割り当てられているにもかかわらず、引数pの範囲を割り当てるしようとしているよう

----> return map(functools.partial(func,**kwargs), range(1,kwargs['b']+1)) 

TypeError: basic_rule() got multiple values for keyword argument 'p' 

に見えます。範囲をvxの値に代入しようとしています。どのように私はそれが起こることができる任意のアイデア?

EDIT:コードに余分なコンテキストを少し追加しました。基本的にテスト5にしたいのは、vtが上がるにつれて関数の結果が大きくなるようにして、func(vt = 1)< func(vt = 2)... < func(vt = n)。それで部分は、元の関数を呼び出すことができ

  • arguments格納位置引数
  • keywords格納全てのキーワードベースの引数

+0

basic_ruleの '' kwargs''の目的は何ですか? –

+0

ラムダの代わりに 'functools.partial()'を使っているのはなぜですか? –

+1

vx!= 0 else 0'の場合は 'kwargs [" p "]/kwargs [" b "]に変更し、関数の署名を' basic_rule(vx = 1、** kwargs): 'に変更するとエラーは回避できますが、あなたの最終目標は –

答えて

0

functools.partial 2つのプロパティで引数receiveidsを記憶する部分を生成しますまさに意図されたとおりです。言い換えれば、あなたは一つの引数と結果の部分を呼び出すとき、それは同じだろう(1、のは言わせて):あなたのkwargsは最初の引数が含まれていたよう

original_func(1, **kwargs) 

- あなたは「1」を渡しています位置の引数として - あなたはエラーを取得します。

この特定のケースではうまくいくかどうかわかりませんが、inspect.getargspecを使用すると、位置引数として渡すことができるkwargsから引数を抽出できます。この場合、rule5関数は次のようになります。

def rule5(func, **kwargs): 
    # let's save 'b' argument because we'll need it in the range call 
    b = kwargs['b'] 
    original_args = inspect.getargspec(func).args 
    # extract from kwargs all arguments that can be passed as positional 
    new_args = [kwargs.pop(key) for key in original_args if key in kwargs] 
    # construct the partial passing as much positional arguments as possible 
    fn = functools.partial(func, *new_args, **kwargs) 
    # now map will pass the range result as the next positional argument 
    vals = map(fn, range(1, b+1)) 
    return [x for i,x in enumerate(vals[:-1]) if x >= vals[i+1]] == [] 
関連する問題