2

Pythonでオプションの引数と*argsパラメーターの両方を使用してメソッドを定義および呼び出す方法について質問があります。例えば、

def test_func(arg1, optional_arg=None, *args):
    ...

そして、次のステートメントのいずれかを使用してメソッドを呼び出せるようにしたいと思います。

test_func("foo", arg1, arg2, ..., optional_arg="bar")
...
test_func("foo", arg1, arg2, ...) 
# arg1, arg2 ... belongs to *args;
# optional_arg is unset (defaults to None)

これはまったく可能ですか、それともこのようなメソッドを呼び出すときにoptional_argを何かに設定する必要がありますか?つまり、関数を呼び出すときにoptional_arg = ...と具体的に記述した場合にのみ、optional_argを設定する必要があります。

4

4 に答える 4

5

そのためには**kwargsを使用する必要があります。

def test_func(arg1, *args, **kwargs):
    optional_arg = kwargs.get('optional_arg')
    ...

唯一の制限は、キーワード付き引数(optional_arg)は常にキーワードなしの引数の後になければならないということです

>>> test_func("foo", optional_arg="bar", arg1, arg2, ...)
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> test_func("foo", arg1, arg2, ..., optional_arg="bar")
...
>>> test_func("foo", arg1, arg2, ...)
...
于 2012-07-17T07:58:30.213 に答える
2

残念ながら、位置引数では、デフォルト値がある場合でも、名前付き引数の値を指定する必要があります。これを回避することはできません。

于 2012-07-17T07:52:20.050 に答える
1

Pythonでは、キーワード引数は関数呼び出しの最後に来る必要があります。最初の例のように呼び出すことはできませんtest_func。optional_arg= "bar"は、すべての非キーワード引数の後に来る必要があります。

于 2012-07-17T07:56:13.983 に答える
1

この種の回避策を試すことができます。

def test_func(arg1, *args,**optional_arg):
    print arg1 
    print args 
    if 'optional_arg' in optional_arg:
        print optional_arg['optional_arg'] 

test_func("foo", 'v','n',optional_arg="bar")

test_func("foo",'v','n')
于 2012-07-17T08:02:07.557 に答える