345

複数の引数を取る 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]
4

6 に答える 6

381

パラメータを使用するだけで、 の*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

于 2012-03-02T20:35:13.093 に答える
275

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

于 2012-03-02T20:32:31.200 に答える