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

Why define a function inside a decorator?

为什么在装饰器中定义一个新函数作为下面的包装函数是一种做法:

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

最后的结果不一样吗?此外,如果我们需要添加一些功能,我们也可以这样做,所以我真的不明白为什么装饰器是这样写的,但一定有一个很好的理由。 :)

编辑:我不小心在第一个案例中留下了括号,问题应该是这样的

装饰器的想法是return一个可以根据需要调用的函数,并根据装饰器的目的增强功能。

您所建议的将无法使用。首先,如果我在晚上实例化这个函数,你的建议将return None,即使我在中午调用该函数,我的调用程序也会崩溃。

更一般地说,您的提案基于实例化时间而不是我的用例调用函数时冻结功能。

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