在Python 101一书中,第162页,有一个关于日志装饰器函数的示例。代码如下:
import logging
def log(func):
"""
Log what function is called
"""
def wrap_log(*args, **kwargs):
name = func.__name__
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
# add file handler
fh = logging.FileHandler("%s.log" % name)
fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(fmt)
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.info("Running function: %s" % name)
result = func(*args, **kwargs)
logger.info("Result: %s" % result)
return func
return wrap_log
@log
def double_function(a):
"""
Double the input parameter
"""
return a*2
if __name__=="__main__":
value = double_function(2)
通常,value
代码末尾应等于 double_function
的返回值,在本例中等于 4。然而执行后在控制台查看,发现等于double_function
它本身,而不是它的返回值(是的,value
成为了函数)。
为什么会发生这种情况?我该如何使用 double_function
作为返回其正确返回值的普通函数?
注意:我使用的是 Python 3.6.5。
最佳答案
@aran-fey 是对的
import logging
def log(func):
"""
Log what function is called
"""
def wrap_log(*args, **kwargs):
name = func.__name__
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
# add file handler
fh = logging.FileHandler("%s.log" % name)
fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(fmt)
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.info("Running function: %s" % name)
result = func(*args, **kwargs)
logger.info("Result: %s" % result)
return result # Your error was you returned the function, not the result
return wrap_log
@log
def double_function(a):
"""
Double the input parameter
"""
return a*2
if __name__=="__main__":
value = double_function(2)
print(value)
关于python - 装饰后不再获取函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51338696/