2016-05-25 5 views
5

便利関数別の関数(bar)のラッパー関数です(foo)。 foobarを呼び出し、出力に対してもう2つのタスクを実行します。たとえば:fooを検査するユーザーは、彼らが渡すことができます知っているように、私はbarからのキーワードと引数を含むようにfooのコールサインを希望他の関数の引数のスーパーセットを受け入れる関数の関数呼び出しシグネチャを一貫して保持する

def bar(bar_arg, bar_kw=None): 
    #do some stuff 
    return ret 

def foo(bar_arg, foo_arg, bar_kw=None, foo_kw=None): 
    ret = bar(bar_arg, bar_kw) 
    ret.some_method(foo_arg, foo_kw=foo_kw) 

、しかし、私はの完全なリストを維持避けたいですbarからのパッケージ自体が更新され、その引数リストが長いため、変更する傾向があります。 fooは常にbarを呼び出します。barが受け入れる引数とキーワードの完全なリストは、自分でリストを管理する必要があるとは思われません。

barのコールシグネチャに基づいてfooのコールシグネチャを作成する方法はありますか。さらに、fooの入力を辞書または名前空間にキャプチャして、fooで使用されている引数とキーワードを、barで使用されているものと簡単に区別できるようにする方法がありますか?

注:私は* argsと** kwargsについて知っています。ただし、関数の署名はあいまいですが、どの引数とキーワード引数が許可されているかをユーザーに通知しません。

編集:私の使用例は、この例よりもはるかに複雑であることに注意してください。呼び出される外部関数(bar)はmatplotlib.colorbar.ColorbarBaseです。呼び出し関数(foo)は、私自身の多くのアプリケーションで使用されるプロットクラスのクラスメソッドで、他のクラスが将来使用する可能性があります。 fooはカラーバーを作成し、ColorbarBaseで受け付けられていない追加の引数とキーワードに基づいて、カラーバーの追加作業を行います。

+0

デコレータを(おそらく引数として 'bar'リファレンスを取得して)持っている可能性があります。 – SuperSaiyan

+0

私は 'ret.some_method'と' return ret'を意味すると思います。 –

+0

@Alexありがとう、編集中。その私が – Vorticity

答えて

0

ベストの選択肢は、fooを省略することです。ユーザが必要とする単純なビルディングブロックでAPIを短く甘くして、ライブラリの使い方を素早く学ぶことができます。プログラマは、自分が実際に望む便利な機能を非常に簡単に作成することができます。

実際の機能が質問よりも複雑な場合は、質問を更新して表示してください。今のところは、単に自分のために

my_bar = bar(bar_arg, bar_kw) 
my_bar.some_method(foo_arg, foo_kw=foo_kw) 

を書くプログラマのための明確かつ明示的です。読者は何が起こっているのかを正確に知っており、長い引数リストを解析する必要はなく、余分なコード行は問題ありません。 ColorbarBaseコンストラクタを呼び出し

+0

探しているものならば – Vorticity

+0

私はちょうど私のケースが擬似コードの例より複雑であることを部分的に説明するために私の答えを編集しました。 – Vorticity

+1

@Vorticityたとえば、bar.some_method' 'のようなものはありませんではなく、それはいくつかの複雑なラインですが、その後、あなたが戻ってシンプルに得ることができるように' * 'bar.some_method'または' some_function(バー)を作成する*を検討し、もしきれいに区切られた引数を持つビルディングブロック。それがうまくいかない場合は、あなたの説明があまり有益ではないので、実際のコードまたはより現実的な疑似コードを表示してください。 –

1

bar()ので、ラップfoo()は、foo()コール周りのデコレータを書きます。デコレータは、foo()を呼び出す前に、barに渡された引数を変更します。例えば

from matplotlib import pyplot 
import matplotlib as mpl 


def bar(f): 
    def wrapper(*args, **kwargs): 
     # Change args, kwargs for calling foo() 
     f(*new_args,**new_kwargs) 
     return 
return wrapper 


@bar 
def foo(*new_args, **new_kwargs): 
    return mpl.colorbar.ColorbarBase(*new_args, **new_kwargs) 

、以下では、その後、bar()によって改変されるパラメータの初期セットを与える呼び出し側にColorbarBaseオブジェクトを返します。このようにしてfoo()のコールシグネチャは、bar()のコールシグネチャに基づいています。

fig = pyplot.figure(figsize=(8, 3)) 
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15]) 
cmap = mpl.cm.cool 
norm = mpl.colors.Normalize(vmin=5, vmax=10) 

ret = foo(ax1, 
      cmap=cmap, 
      norm=norm, 
      orientation='horizontal') 
関連する問題