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 回答