Python 装饰后不再获取函数的返回值

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.

在《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)
通常,代码末尾的
应等于
双_函数
的返回值,在这种情况下等于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
。啊,谢谢,就这么简单!