考虑这个模块:
#mymodule.py
import logging
def print_start_end(name):
"""
Decorator that creates a logger and logs the start
and the end of the function call
"""
def decorator(f):
logger = logging.getLogger(name)
def wrapper(*args, **kwargs):
logger.info("start")
res = f(*args, **kwargs)
logger.info("end")
return res
return wrapper
return decorator
@print_start_end(__name__)
def f(x):
return x
def g(y=f(3)):
return y
还有一个示例脚本:
import logging
from mymodule import f
logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)
print f(3)
输出:
start
end
3
装饰器正在工作。但现在我编写了一个脚本来使用 g
而不是 f
:
import logging
from mymodule import g
logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)
print g()
输出:
3
执行语句print g()
时,对f
的调用成功,因为它打印了预期的返回值3。但是为什么它不打印“开始”和“结束”?
最佳答案
请注意,def g(y=f(3)):
中的 f(3)
仅执行一次,当函数是定义的,而不是每次调用时都定义的。
因此,问题似乎是在 mymodule
中执行 f(3)
时,记录器尚未初始化。先初始化,再导入,就可以了:
import logging
logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)
from mymodule import g
print g()
关于python - 使用修饰函数作为函数的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31053128/