Python 如何将装饰器应用于lambdas?

Python 如何将装饰器应用于lambdas?,python,syntax,lambda,decorator,Python,Syntax,Lambda,Decorator,在Python中,对lambda函数使用decorator有什么语法吗?例如: def simpledecorator(f): def new_f(): print "Using a decorator: " f() return new_f @simpledecorator def hello(): print "Hello world!" 此输出中的结果: 你好() 使用简单的装饰器: 你好,世界! 然而,当我试着用兰姆

在Python中,对lambda函数使用decorator有什么语法吗?例如:

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

@simpledecorator
def hello():
    print "Hello world!"
此输出中的结果:

你好() 使用简单的装饰器: 你好,世界! 然而,当我试着用兰姆达做同样的事情时:

@anotherdecorator
f = lambda x: x * 2
我明白了:


File”似乎有两个选项提供了功能,但没有清晰的语法:

(1) 保留
lambda
并放弃decorator语法(由dan04发布):

f=SimpleCorator(lambda:print(“Hello World”)

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

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

如果您希望连锁装饰师,则第二种形式可能更可取:

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


尝试以上使用只会给我语法错误

这就是我发现有效的方法:

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

我希望我早一点就想到这一点。它确实避免了
@decorator
语法试图对抗的情况,即
f=anotherdecorator(f)
。不过,这是一个非常有用的语言特性。在
@
语法之前,类似这样的东西是修饰函数(或类)的主要方式。语法错误,请删除返回的f=anotherdecorator(lambda x:x*2)
import shutil
from retry_decorator import retry
diskfree = retry(
    FileNotFoundError,
    timeout_secs = 10,
  )(lambda d: shutil.disk_usage(d))(d="/")