开发者

How to apply decorators to lambdas?

开发者 https://www.devze.com 2023-01-24 04:49 出处:网络
Is there any syn开发者_如何学Ctax for using a decorator on a lambda function in Python? Example:

Is there any syn开发者_如何学Ctax for using a decorator on a lambda function in Python? Example:

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

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

Results in this output:

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

Yet when I try the same with a lambda:

@anotherdecorator
f = lambda x: x * 2

I get this:

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

I feel like this might be a good way to make lambdas more versatile by allowing statements to be "injected" into them. But if there exists such a feature, I don't know what the syntax is.


f = anotherdecorator(lambda x: x * 2)


There appear to be two options which give the functionality, but without the clean syntax:

(1) Keep lambda and ditch the decorator syntax (as posted by dan04):

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

(2) Keep the decorator syntax and use a 1 line def statement instead of lambda:

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

This 2nd form may be preferable if you want to chain decorators:

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


Trying the above using the retry-decorator only gave me syntax errors.

This what I found to be working:

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

精彩评论

暂无评论...
验证码 换一张
取 消