Python试图将关键字参数放在*args之后

Python试图将关键字参数放在*args之后,python,python-2.x,variadic-functions,keyword-argument,Python,Python 2.x,Variadic Functions,Keyword Argument,我对使用*args有点困惑 我想编写一个函数,它接受可变数量的参数,但仍然可以利用为关键字参数定义预定义值的优势 但不可能编写这样的函数: def foo(*args, bar = "foo"): print bar, args def foo2(bar = "foo", *args): print bar, args def foo(*args, **kwargs): kwargs["bar"] = "foo" 可以这样写: def foo(*args, bar

我对使用
*args
有点困惑

我想编写一个函数,它接受可变数量的参数,但仍然可以利用为关键字参数定义预定义值的优势

但不可能编写这样的函数:

def foo(*args, bar = "foo"):
    print bar, args
def foo2(bar = "foo", *args):
    print bar, args
def foo(*args, **kwargs):
    kwargs["bar"] = "foo"
可以这样写:

def foo(*args, bar = "foo"):
    print bar, args
def foo2(bar = "foo", *args):
    print bar, args
def foo(*args, **kwargs):
    kwargs["bar"] = "foo"
但是我调用
foo2
并传递第一个参数,它覆盖了
bar
的默认值

foo2("somevalue")
somevalue ()
哪里有更好的方法

我知道我可以这样写:

def foo(*args, bar = "foo"):
    print bar, args
def foo2(bar = "foo", *args):
    print bar, args
def foo(*args, **kwargs):
    kwargs["bar"] = "foo"

但是,从我的观点来看,类似于第一个方法定义(它会产生语法错误)的东西更直观。

您可以使用
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'}

您可以切换到python 3吗?在python 3中,您可以使用第一种方法:

def foo(*args, bar = 'default_value'):
    print (args, bar)

foo(bar = 'newval')
foo('hola2')
您将获得:

() newval
('hola2',) default_value

如果升级到Python3.x,可以使用第一种形式(请参阅)。我认为还有另一种方法可以在方法签名中保留默认值。但我之所以选择这个解决方案,是因为我无法切换到Python3。谢谢你们!