为什么要在装饰器中定义一个函数?
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
,即使我在中午调用该函数,我的调用程序也会崩溃。
更一般地说,您的提案基于实例化时间而不是我的用例调用函数时冻结功能。
这不会是相同的结果,在第一个带有包装器的示例中,每次调用装饰函数时都会检查时间条件。在第二个示例中,时间条件将在您将装饰器应用于函数时检查一次。
为什么在装饰器中定义一个新函数作为下面的包装函数是一种做法:
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
,即使我在中午调用该函数,我的调用程序也会崩溃。
更一般地说,您的提案基于实例化时间而不是我的用例调用函数时冻结功能。
这不会是相同的结果,在第一个带有包装器的示例中,每次调用装饰函数时都会检查时间条件。在第二个示例中,时间条件将在您将装饰器应用于函数时检查一次。