25

ユーザーがオプションでフォームから送信できる次の変数があります (必須ではありませんが、検索を絞り込むためにこれを行う場合があります)。

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

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

引数なしの関数は次のとおりです。

apicall = search ()

色だけで

apicall = search (color)

そして色とサイズでそれは

apicall = search (color, size)

引数が定義されている場合は関数に渡したいのですが、定義されていない場合は渡したくありません。

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

4

4 に答える 4

16

これが標準的な呼び出し (辞書など) であると仮定するとget、これは簡単なはずです。Noneパラメータのデフォルトを使用して関数を定義し、それらをチェックする手間をかけずに渡しcolorてください!size

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

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

この方法では、None引数を 1 か所 (関数呼び出しの内部で、関数を複数の方法で呼び出すことができるかどうかをとにかくチェックする必要があります) でのみチェックします。すべてが素晴らしく清潔に保たれます。もちろん、これは (冒頭で述べたように)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)

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

于 2013-05-15T23:24:57.533 に答える
-2

メソッドを定義するときに、デフォルトの引数を設定すると、引数を指定するかどうかを指定できます。

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

次に、それを呼び出すときに、選択したキーワード引数を指定できます。これらは両方とも有効です。

apicall = search(color=color)
apicall = search(size=size)
于 2013-05-15T23:25:58.233 に答える