【问题标题】:how to insert new variable in (*args,**kwargs) section?如何在 (*args,**kwargs) 部分插入新变量?
【发布时间】:2013-10-29 10:58:51
【问题描述】:

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

例如在 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))

【问题讨论】:

  • r 只能接受一个参数,您传递的参数太多。

标签: python python-3.x lambda decorator


【解决方案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对此有详细解释。

【讨论】:

  • 这行不通,会引发:TypeError: &lt;lambda&gt;() got an unexpected keyword argument 'y'
  • r 只接受两个参数,因为您可以将可变数量的位置和关键字参数传递给func 的参数。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 2021-03-20
    • 2023-03-19
    • 2013-08-04
    • 2020-09-16
    • 2017-01-28
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多