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

时间:2012-07-17 07:49:16

标签: python python-2.7 optional-parameters iterable-unpacking

我有一个关于如何使用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 个答案:

答案 0 :(得分:5)

您应该使用**kwargs

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

唯一的限制是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, ...)
...

答案 1 :(得分:2)

不幸的是,位置参数会强制您为命名参数指定一个值,即使它具有默认值也是如此;你无法解决这个问题。

答案 2 :(得分:1)

在Python中,关键字参数必须在函数调用中排在最后,您不能像在第一个示例中那样调用test_func,optional_arg =“bar”必须在所有非关键字参数之后。< / p>

答案 3 :(得分: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')