首页 > 解决方案 > Python - 确保装饰函数保留元数据

问题描述

您能否让我知道装饰函数是否可以保留其元数据?这将是装饰器的代码:

def timer(func):
  """prints how long a function takes to run."""
  def wrapper(*args, **kwargs):
    t_start = time.time()

    result = functionalists(*args, **kwargs)

    t_total = time.time() - t_start
    print('{} took {}s'.format(functionalists.__name__, t_total))

    return result

  return wrapper

以下将是装饰功能。

@timer
def sleep_n_seconds(n=10):
  """pause processing for n seconds.

  Args:
    n (int): The number of seconds to pause for.
  """
  time.sleep(n)

当我尝试使用以下代码打印文档字符串时,不会返回元数据。

print(sleep_n_seconds.__doc__)

如果我需要提供更多详细信息,请告诉我。

谢谢

标签: pythonpython-decorators

解决方案


使用模块中的wraps函数functools来保留签名。:

from functools import wraps 
def timer(func):
  @wraps(func)
  """prints how long a function takes to run."""
  def wrapper(*args, **kwargs):
    t_start = time.time()

    result = functionalists(*args, **kwargs)

    t_total = time.time() - t_start
    print('{} took {}s'.format(functionalists.__name__, t_total))

    return result

  return wrapper

推荐阅读