装饰器可以在运行时使用lambda表达式吗?

时间:2011-02-23 17:59:35

标签: python lambda decorator

def attrs(**kwds):
      def decorate(f):
          for k in kwds:
              setattr(f, k, kwds[k])
          return f
      return decorate

@attrs(argument_types=(int, int,), returns=int)
def add(a, b):
      return a + b 

这里我需要add()可以显示其可接受的参数类型。 但是我可以在运行时做这样的事吗?

ladd=[]
for x in range(0,10):

      @attrs(argument_types=int, returns=int,default_parameter1 = x) 
      exp =  lambda : add(a,x)  
      ladd.append(exp)

ladd=[]
for x in range(0,10):

      @attrs(argument_types=int, returns=int,default_parameter1 = x) 
      addx = functools.partial(add, 2)  
      ladd.append(addx)

我需要那些函数可以生成运行时使用“decoratored”参数绑定


嗯,这里是错误信息,我认为上面的代码无法正常工作,但我从未尝试将其粘贴到python中进行测试...

>>> ladd=[]
>>> for x in range(0,10):
...     @attrs(argument_types=int, returns=int,default_parameter1 = x) 
...     exp =  lambda : add(a,x)  
  File "<stdin>", line 3
    exp =  lambda : add(a,x)  
      ^
SyntaxError: invalid syntax
>>>     ladd.append(exp)
  File "<stdin>", line 1
    ladd.append(exp)
    ^
IndentationError: unexpected indent
>>> 

2 个答案:

答案 0 :(得分:10)

装饰器语法只是语法糖,虽然它将人们的想法引导到有趣的方向。

@expr
def f(...):
    ...

相同
def f(...):
    ...
f = expr(f)

所以你可以使用attrs(argument_types=..., ...)(lambda: ...)

答案 1 :(得分:8)

@语法只是用于调用装饰器的语法糖,下一个函数是它的参数。这意味着

@deco
def func(): pass

相同
def func(): pass
func = deco(func)

所以你想要的只是:

ladd=[]

for x in range(0,10):    
      deco = attrs(argument_types=int, returns=int,default_parameter1 = x) 
      addx = functools.partial(add, 2)
      # append the "decorated" function
      ladd.append(deco(addx))