【发布时间】:2015-09-12 05:22:41
【问题描述】:
考虑这个模块:
#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。但是为什么它不打印“开始”和“结束”呢?
【问题讨论】:
-
这是你的记录器,我几乎完全确定。我这么说的原因是,如果你在包装器中添加一个 print 语句,你可以看到它被 f(3) 调用。
标签: python python-2.7 logging decorator python-decorators