【问题标题】:Can a decorator be working with a lambda expression at runtime? [duplicate]装饰器可以在运行时使用 lambda 表达式吗? [复制]
【发布时间】:2011-07-02 23:14:29
【问题描述】:
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)

我需要那些函数可以生成运行时与“装饰”参数绑定要么


嗯,这是错误信息,我认为上面的代码不能工作,但我从来没有尝试将它粘贴到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
>>> 

【问题讨论】:

  • 你试了一下,遇到了什么错误?
  • @S.Lott:虽然错误消息通常非常有用,并且在有疑问时应该包含在内,但任何有足够 Python 知识来回答这个问题的人都应该非常清楚这是一个普通的语法错误.
  • @delnan:这个问题不是针对“任何有足够 Python 知识可以回答的人”,而是针对@user478514 用更多信息更新问题,也许自己做一些真正的调试工作。当然,您是对的,但有时人们只需提供所见内容的文档即可获得帮助。
  • @S.Lott:感谢您的指出,我认为您的意思是我应该在粘贴之前对其进行测试。在这种情况下,我认为上面的“代码”可能不起作用,所以我从不测试它,实际上,这只是我心中的“假设”想法。
  • @user478514:困惑不是“如果”。困惑意味着你有让你困惑的代码。 “如果”是愚蠢的,因为用代码实际一些事情并实际看到做其他事情会发生什么要容易得多。提示如下:先尝试

标签: python lambda decorator


【解决方案1】:

@ 语法只是用 next 函数作为参数调用装饰器的语法糖。这意味着

@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))

【讨论】:

  • @OP:正如 Jochen 的代码所示,装饰器只是碰巧接受和返回其他函数的函数。
【解决方案2】:

装饰器语法只是语法糖,尽管它可以将人们的思想引向有趣的方向。

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

等同于

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-01-13
    • 2017-06-15
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多