如何使用可选参数和参数解包来定义方法?

Atr*_*ami 2 python optional-parameters python-2.7 iterable-unpacking

我有一个关于如何使用Python中的可选参数和*args参数来定义和调用方法的问题.例如,

def test_func(arg1, optional_arg=None, *args):
    ...
Run Code Online (Sandbox Code Playgroud)

我希望能够使用以下任一语句调用该方法:

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)
Run Code Online (Sandbox Code Playgroud)

这有可能吗,或者我在调用这样的方法时总是要将optional_arg设置为某个东西吗?即我只想在调用函数时专门编写optional_arg = ...时设置optional_arg.

mat*_*ath 5

你应该使用**kwargs.

def test_func(arg1, *args, **kwargs):
    optional_arg = kwargs.get('optional_arg')
    ...
Run Code Online (Sandbox Code Playgroud)

唯一的限制是keyworded参数(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, ...)
...
Run Code Online (Sandbox Code Playgroud)