2013-05-15 20 views
5

ユーザーがオプションでフォームを介して送信できる次の変数があります(必須ではありませんが、検索を絞り込むために必要です)。Python - 変数が存在する場合にのみ引数を渡します。

color = request.GET.get ('color') 
size = request.GET.get ('size') 

これらの変数は関数に渡したいが、存在する場合にのみ渡したい。それらが存在しない場合は、引数なしで関数を実行するだけです。引数なし

機能は次のとおりです。色付き

apicall = search() 

だけでは

apicall = search (color) 

だと引数は、私が渡したい定義されている場合は色とサイズとそれが

apicall = search (color, size) 

です私はそれを渡すことを望んでいません。

これを行う最も効率的な方法は何ですか? pythonには組み込みのメソッドがありますか?

答えて

6

これは標準のgetコール(辞書のようなもの)だとすれば、これは簡単であるはずです。パラメータのデフォルト値としてNoneを使用して関数を定義してから、colorsizeを確認してください。

def apicall(color=None, size=None): 
    pass # Do stuff 

color = request.GET.get('color') 
size = request.GET.get('size') 
apicall(color, size) 

この方法で、あなただけ(あなたは関数が複数の方法を呼び出すことができるかどうか、とにかくチェックする必要があり、関数呼び出し、内部の)一つの場所にNone引数を確認してください。すべてが素敵で清潔に保たれています。もちろん、これはあなたのget呼び出しが通常のPython辞書のgetメソッドのようなものであることを前提としています(値が見つからない場合はNoneを返します)。

最後に、あなたの関数名がapicallであることがわかりました。実際には、関数コード自体に実際にアクセスできない可能性があります。この場合、関数シグネチャのデフォルト値については何も知らないかもしれないし、Noneが間違っているかもしれないので、おそらく単純なラッパーを使って引数チェックを行うだけです。上記のようにラッパーを呼び出すことができます!

def wrapped_apicall(color=None, size=None): 
    if color is None and size is None: 
     return apicall() 
    # At least one argument is not None, so... 
    if size is None: 
     # color is not None 
     return apicall(color) 
    if color is None: 
     # size is not None 
     return apicall(size) 
    # Neither argument is None 
    return apicall(color, size) 

注:あなたが呼び出しているコードを参照することはできませんし、その上に任意のドキュメントを持っていない場合を除きこの第二のバージョン必要はありません! Noneをデフォルトの引数として使用するのは非常に一般的です。そのため、最初の方法を使用する可能性があります。あなたが呼び出している関数を変更できず、そのデフォルト引数が何であるかわからない場合(あるいはデフォルトの引数がモジュール定数か何かかはわかりませんが、それはかなりまれです)、私はラッパーメソッドを使います。

+0

はい、私は変数の一つが、その後 'apicall(色、サイズ)を定義されていない場合は'エラーを投げるでしょうか? – user1328021

+0

ありがとう...あなたが書いたことは、どうやってやろうとしているのかということですが、もっと効率的な方法が必要だと思っていました... – user1328021

+0

@ user1328021これらの行が両方とも実行されていると仮定します: 'color = request.GET .get( 'color') 'と ' size = request.GET.get( 'size') 'とすると、' color'と 'size'の両方が** defined **になることが保証されます。 '。あなたはこれについて非効率的だと思いますか? –

0

メソッドを定義しているときに、デフォルトの引数を設定する場合は、引数を指定することができます。

def search(color=None, size=None): 
    pass 

これを呼び出すと、選択したとおりにキーワード引数を指定できます。

apicall = search(color=color) 
apicall = search(size=size) 
0

meybeあなたはこのようなものを使用することができます:これらの両方が有効になり

try: 
    apicall = search (color, size) 
else: 
    apicall = search(color) 
+0

仕事はありません...サイズは無しですが、まだ存在します... –

関連する問題