我想了解此代码中的装饰器行为
abc.py
def my_decorator_module(some_function):
def wrapper():
num = 10
if num == 10:
print('yess')
else:
print('no')
some_function()
print('print after some_function() called')
return wrapper()
并将此函数称为装饰器
x.py
from abc import my_decorator_module
@my_decorator_module
def just_some_function():
print("Wheee!")
输出
yess
Wheee!
print after some_function() called
当我执行x.py文件返回输出时,我没有在x.py文件中调用just_some_function()
,为什么?
答案 0 :(得分:3)
因为您在从外部装饰功能返回之前调用了wrapper
。别这么做。
return wrapper # not wrapper()
tutorial you're following之前已经引入了返回函数的概念,而不是调用它们并返回它们的结果;这就是你需要在这里做的事情。
答案 1 :(得分:2)
你没有明确地称呼just_some_function()
,而是你的"装饰者"确实,比较最后一行:
def my_decorator_module(some_function):
def wrapper():
num = 10
if num == 10:
print('yess')
else:
print('no')
some_function()
print('print after some_function() called')
# here !!!
return wrapper()
这实际上是一个错误的实现 - 你的装饰者不应该返回调用wrapper
的结果,而是返回wrapper
函数本身:
return wrapper
如果您不明白原因:@decorator
语法只是语法糖,所以:
@decorator
def somefunc():
print("somefunc")
实际上只是一个捷径:
def somefunc():
print("somefunc")
somefunc = decorator(somefunc)
所以你的装饰者必须返回一个函数对象(或任何可调用的FWIW),通常 - 但不一定 - 一些包装器将负责调用装饰函数(最好返回结果)。