いくつかの引数を取る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]
obj.some_function( '1', 2, '3', g="foo", h="bar" )
のように呼び出してみてください。必須の位置引数の後に、名前で特定のオプション引数を指定できます。
* 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
の後に重要な値となるすべてのパラメータの辞書を持っています。