为什么要在装饰器中定义一个函数?

时间:2020-10-12 20:35:31

标签: python python-decorators

为什么要在装饰器中定义一个新函数作为下面的包装器函数呢?

def not_during_the_night(func):
    def wrapper():
        if 7 <= datetime.now().hour < 22:
            return func
        else:
            pass  # Hush, the neighbours are asleep
    return wrapper

不仅仅是做类似的事情?:

def not_during_the_night(func):
    if 7 <= datetime.now().hour < 22:
        return func
     else:
        pass  # Hush, the neighbours are asleep

最终结果不一样吗?另外,如果我们需要添加一些功能,我们也可以做到这一点,因此我真的不明白为什么这样编写装饰器,但是一定有充分的理由。 :)

编辑:我不小心在第一种情况下放在了括号内,问题应该是这样的

2 个答案:

答案 0 :(得分:2)

修饰器的想法是返回一个可以根据需要调用的函数,并根据修饰器的用途增强了功能。

您的建议将无法使用。首先,如果我在夜间实例化该实例,那么即使我在中午调用该函数,您的提案也会返回None,并且我的调用程序也会崩溃。

通常,您的提案会根据实例化的时间冻结功能,而不是在我的用例调用功能时冻结。

答案 1 :(得分:1)

结果将不同,在第一个使用包装器的示例中,每次调用装饰函数时都会检查时间条件。在第二个示例中,在将装饰器应用于函数时,将仅检查一次时间条件。