【问题标题】:Preserving function docstrings when decorating them using decorator classes使用装饰器类装饰函数文档字符串时保留它们
【发布时间】:2020-06-08 00:28:37
【问题描述】:

我想知道编写装饰器类以保留装饰函数的文档字符串的正确方法是什么。例如,考虑以下代码行:

import functools

class _vectorize:
    """ (private) decorator to vectorize a function """


    def __init__(self, func):
        functools.update_wrapper(self, func)
        self._func = func

    def __call__(self, values, *args, **kwargs):

        return [self._func(val, *args, **kwargs) for val in values]


@_vectorize
def multiply(v, s):
    """ Multiplies all values in `v` by scalar `s`. """
    return v*s

我希望客户端通过调用help(multiply) 来查看multiply 函数的文档字符串,但事实并非如此:

>>> help(multiply)

Help on instance of _vectorize in module docstring:

multiply = class _vectorize
 |  (private) decorator to vectorize a function
 |  
 |  Methods defined here:
 |  
 |  __call__(self, values, *args, **kwargs)
 |  
 |  __init__(self, func)

要查看正确的文档,必须直接打印__doc__ 属性:

>>> print(multiply.__doc__)
 Multiplies all values in `v` by scalar `s`. 

我应该如何修改装饰器以便help 打印所需的文档?

【问题讨论】:

  • 在模块中使用functools.wraps()或相关函数。

标签: python python-decorators docstring


【解决方案1】:

我使用functools.wraps,它更短,适用于您的情况并显示正确的文档字符串:

import functools

def _vectorize(func):
        @functools.wraps(func)
        def wrapFunc(values, *args, **kwargs):
                return [func(val, *args, **kwargs) for val in values]
        return wrapFunc

@_vectorize
def multiply(v, s):
    """ Multiplies all values in `v` by scalar `s`. """
    return v*s

见:What does functools.wraps do?

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2011-10-04
    • 2019-07-23
    • 2010-09-13
    相关资源
    最近更新 更多