如何将装饰器应用于lambda函数?

32

在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

我觉得这可能是使Lambda更加多才多艺的好方法,因为它允许语句被"注入"进去。但如果存在这样的功能,我不知道语法是什么。

3个回答

56
f = anotherdecorator(lambda x: x * 2)

2
我希望我早点想到这个。它确实避免了 @decorator 语法试图解决的情况,即 f = anotherdecorator(f)。不过,这是一种非常有用的语言特性。 - Rafe Kettler
10
@ 语法出现之前,像这样装饰一个函数(或类)的主要方法是这样的。 - martineau
2
语法错误,请移除 return f = anotherdecorator(lambda x: x * 2)。 - progressdll

2

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

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

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

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

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

如果您想要链接多个装饰器,那么第二种形式可能更加适合:

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


0

尝试使用重试装饰器,但只会给我带来语法错误。

这是我发现可行的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接