オプションの引数を使用してPython関数を作成するにはどうすればよいですか?


218

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

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

引数dhは、それぞれ異なる意味を持つ文字列です。任意の組み合わせで渡すオプションのパラメーターを選択できることが重要です。たとえば、、、、(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]

回答:


194

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


245

*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


ありがとうございました。コードでこれほどの柔軟性を使用することはできず、リスト内のさまざまな空の穴を呼び出す問題を解決することはできませんが、別のプロジェクトで使用するのに最適なツールです。そして、ラッセル・ボロゴーブは私が私の問題に必要な正確な答えを私にくれました、私は幸せです。
Thalia


@ニックス、私はあなたの答えが本当に好きです。ただし、そのステートメントのc = kwargs.get('c', None)用途を明確にしていただけませんか。オプションの引数を持つすべての関数で必要ですか?あなたのコードでは、2つのオプションの引数しかありませんでした。ユーザーが別の引数を言いたい場合はどうなりますeか?例:不明な数のオプション引数のサンプルコードを変更するにはどうすればよいdef my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)ですか?行うc = kwargs.get('c', None) etc前に含める必要がありobj.add(c, d, ...)ますか?
ニモ

時間の複雑さが心配な場合。これは問題になります
NduJay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.