如何在(* args,** kwargs)部分中插入新变量?

时间:2013-10-29 10:58:52

标签: python python-3.x lambda decorator

我想制作一个装饰方法来分配函数将使用但不会自行传递的变量。

例如在lambda r中添加新变量y,我以这种方式编写代码但是没有用。

r = lambda x:x+y

def foo(func):
    def wrapped(*args,**kwargs):
        y = 3
        return func(y=y,*args,**kwargs)
    return wrapped

r = foo(r)
print(r(444))

这也不会起作用

r = lambda x:x+y

def foo(func):
    def wrapped(*args,**kwargs):
        y = 3
        return func(*args,**kwargs)
    return wrapped

r = foo(r)
print(r(444))

2 个答案:

答案 0 :(得分:2)

问题是函数r只能接受一个参数,你需要改变它的定义以接受更多的参数:

r = lambda x, y=0, *args, **kwargs: x + y

def foo(func):
    def wrapped(*args,**kwargs):
        y = 3
        return func(y=y, *args,**kwargs)
    return wrapped

r = foo(r)
print(r(444))
#447

答案 1 :(得分:1)

kwargs是一个随意的python dict类型,所以你可以将y键的值设置为3

r = lambda x, y=0:x+y

def foo(func):
    def wrapped(*args,**kwargs):
        print type(kwargs) #  will output <type 'dict'>
        kwargs['y'] = 3
        return func(*args,**kwargs)
    return wrapped

Understanding kwargs in Python中详细解释了这一点。