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