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

2024-05-18 12:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用*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"

但在我看来,像第一个方法定义(它会产生语法错误)这样的东西更直观。


Tags: 函数参数数量定义foodefbarargs
2条回答

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

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

foo(bar = 'newval')
foo('hola2')

你会得到:

() newval
('hola2',) default_value

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

您可以使用getfoo设置为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'}

相关问题 更多 >

    热门问题