如何将装饰器应用于lambdas?

时间:2010-11-08 16:38:15

标签: python syntax lambda decorator

在Python中的lambda函数上使用装饰器是否有任何语法?例如:

def simpledecorator(f):
     def new_f():
         print "Using a decorator: "
         f()
     return  new_f

@simpledecorator
def hello():
    print "Hello world!"

此输出结果:

>>> hello()
Using a simple decorator:
Hello world!

然而,当我尝试使用lambda时:

@anotherdecorator
f = lambda x: x * 2

我明白了:

  File "<stdin", line 2
    f = lambda x: x * 2
    ^
 SyntaxError: invalid syntax

我觉得这可能是一个很好的方法,通过允许语句“注入”它们使lambdas更加通用。但如果存在这样的功能,我不知道语法是什么。

3 个答案:

答案 0 :(得分:36)

f = anotherdecorator(lambda x: x * 2)

答案 1 :(得分:2)

似乎有两个选项可以提供功能,但是没有简洁的语法:

(1)保留lambda并放弃装饰器语法(如dan04发布):

f = simpledecorator( lambda : print( "Hello World" ) )

(2)保留装饰器语法,并使用1行def语句代替lambda:

@simpledecorator
def f(): print ( "Hello World" )

如果要链接装饰器,则最好使用第二种形式:

@simpledecorator
@simpledecorator
def f(): print ( "Hello World" )

答案 2 :(得分:0)

使用 retry-decorator 尝试上述操作只会给我带来语法错误。

这是我发现的工作:

import shutil
from retry_decorator import retry
diskfree = retry(
    FileNotFoundError,
    timeout_secs = 10,
  )(lambda d: shutil.disk_usage(d))(d="/")