我对使用*args
感到有点困惑。
我想编写一个函数,该函数接受可变数量的参数,但仍然可以使用为关键字参数定义预定义值的优势。
但是不可能编写这样的函数:
def foo(*args, bar = "foo"):
print bar, args
可以这样写:
def foo2(bar = "foo", *args):
print bar, args
然后我调用foo2
并传递第一个参数,它会覆盖bar
的默认值!。
foo2("somevalue")
somevalue ()
这是一种更好的做法吗?
我知道我可以这样写:
def foo(*args, **kwargs):
kwargs["bar"] = "foo"
但是从我的观点来看,第一个方法定义(产生语法错误)之类的东西更直观。
答案 0 :(得分:9)
您将使用kwargs
并在通话中执行分配而不是定义:
def foo2(*args, **kwargs): # kwargs takes our key/values arguments
print args, kwargs
foo2(1, 2, 3, bar="foo") # bar is assigned to in call when using kwargs
给出了:
(1, 2, 3) {'bar': 'foo'}
您可以使用get
将foo
设置为bar
的默认设置,如下所示:
def foo2(*args, **kwargs):
kwargs["bar"] = kwargs.get("bar", "foo") # if bar is not set use foo as val
print args, kwargs
foo2(1, 2, 3, bar="foo")
foo2(1, 2, 3, bar="notfoo")
foo2(1, 2, 3)
除非明确更改,否则kwargs["bar"]
始终为foo
:
(1, 2, 3) {'bar': 'foo'}
(1, 2, 3) {'bar': 'notboo'}
(1, 2, 3) {'bar': 'foo'}
答案 1 :(得分:6)
你可以切换到python 3吗?在Python 3中你可以使用你的第一种方法:
def foo(*args, bar = 'default_value'):
print (args, bar)
foo(bar = 'newval')
foo('hola2')
你会得到:
() newval
('hola2',) default_value