Py学习  »  Python

如何在Python装饰器中使用ufunc=none

Harry Choi • 4 年前 • 741 次点击  

我有以下的装潢师(根据 https://realpython.com/primer-on-python-decorators/#decorators-with-arguments ):

def slow_down(_func=None, rate = 1):

    def decorator(func):

        print(_func) # Added for understanding? 

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            time.sleep(rate)
            return func(*args, **kwargs)
        return wrapper    


    if _func==None:
        return decorator

    else: return decorator(_func) 

我的问题是,这个不应该 slow_down 函数初始化方式 _func = None ?但是,当我用decorator创建一个函数时,我得到一个初始化的func值:

@slow_down
def countdown(time = 5):
    print(time)
    if time == 0: pass
    else: countdown(time-1)
<function countdown at 0x7f1aa0a8da60>

但是当我初始化函数的值时,我得到 None :

@slow_down(rate=2)
def countdown(time = 5):
    print(time)
    if time == 0: pass
    else: countdown(time-1)

None

不是应该换个方向吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38382
 
741 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Nickolay
Reply   •   1 楼
Nickolay    4 年前

当您为一个装饰器使用一个裸名称(如@slow_down)时,它会被作为一个参数来修饰函数来调用。当涉及圆括号时(如第二种情况),将以书面形式调用decorator,并期望返回另一个函数,该函数将被修饰为参数来调用。如果在您的特定装饰器中允许它以任何方式工作。杰森哈珀