web-dev-qa-db-ja.com

オプションの引数を使ってPython関数を作成する方法を教えてください。

いくつかの引数を取るPython関数があります。一部のシナリオでは、これらの引数の一部を省略することができます。

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

引数dからhはそれぞれ意味の異なる文字列です。どのオプションパラメータを任意の組み合わせで渡すかを選択できることが重要です。たとえば、(a, b, C, d, e)(a, b, C, g, h)(a, b, C, d, e, f、またはそれらすべて(これらは私の選択です)。

関数をオーバーロードできれば素晴らしいでしょう - しかし、私はPythonがオーバーロードをサポートしていないことを読みました。リストに必須のint引数をいくつか挿入しようとしましたが、引数の不一致エラーが発生しました。

現時点では、プレースホルダーとして、欠けている最初のいくつかの引数の代わりに空の文字列を送信しています。実際の値を使って関数を呼び出せるようにしたいです。

これを行う方法はありますか?引数リストの代わりにリストを渡すことができますか?

今のところctypesを使ったプロトタイプはこんな感じです:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
127
Thalia

obj.some_function( '1', 2, '3', g="foo", h="bar" )のように呼び出してみてください。必須の位置引数の後に、名前で特定のオプション引数を指定できます。

123

* argsパラメータを使用するだけで、a,b,cの後に必要なだけ引数を渡すことができます。 args-> c、d、e、fをマッピングするためのロジックを追加する必要がありますが、それはオーバーロードの「方法」です。

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

そしてそれはc,d,e,fを表示します


同様に、kwargs引数を使用してから、パラメータに名前を付けることもできます。

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

そしてkwargsはa,bの後に重要な値となるすべてのパラメータの辞書を持っています。

155
Nix