Python 装饰后不再获取函数的返回值
在《Python 101》一书第162页中,有一个关于日志装饰器函数的示例。代码如下:Python 装饰后不再获取函数的返回值,python,python-decorators,Python,Python Decorators,在《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.
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)
通常,代码末尾的值
应等于双_函数
的返回值,在这种情况下等于4。但是,在执行后在控制台中检查时,我发现它等于double\u函数
本身,而不是它的返回值(是的,value
成为函数)
为什么会这样?我如何使用double\u函数
作为正常函数返回其正确的返回值
注意:我使用的是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)
将
returnfunc
更改为returnresult
。啊,谢谢,就这么简单!