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

标签 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.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/

相关文章:

python - 装饰器中不同类型的变量是否有不同的作用域? (Python)

python - 如何直接从 pandas 包导入 Dataframe 类

python - 如何更改 pandas 数据框列中的每个值?

python - 为什么 Python 的装饰器语法比普通包装器语法提供更快的内存代码?

Python内部函数/装饰器: When should I use parentheses when returning an inner function?

python - Behave 的装饰器是如何创建/声明的?

python - 如何在数据库中使 Tornado 请求原子化

python - end =' ' 究竟是做什么的?

python - Pandas:删除所有列中的所有 NaN 值

python - Python 中的 WebSocket 帧解码