如何使用autodoc从Python中的修饰函数获取docstring?

时间:2019-02-12 20:08:44

标签: python django python-sphinx python-decorators autodoc

sphinx autodoc有一个官方已知的问题,当您对函数进行修饰时,其文档字符串将不会显示在生成的文档中。

来自autodoc home page

  

如果要记录修饰的函数或方法,请记住,自动文档通过导入模块并检查给定函数或方法的 doc 属性来检索其文档字符串。从Python 2.5开始,functools.wraps()可用于创建行为良好的装饰函数。

因此,使用functools.wraps()确实可以。

def decorator_func(say_hello_func):       
    """Docstring for decorator_func"""    
    @wraps(say_hello_func)    
    def wrapper_func(hello_var, world_var):    
        """Docstring for wrapper_func"""    
        return say_hello_func(hello_var, world_var)    
    return wrapper_func


@decorator_func    
def say_hello(hello_var, world_var):    
    """Docstring for say_hello function.

    Args:    
        hello_var (str): hello_var    
        world_var (str): world_var

    Returns:    
        str: concatenation of the strings    
    """    
    print hello_var + " " + world_var

制作(粘贴格式不正确)

say_hello(hello_var, world_var)

Docstring for say_hello function.

Parameters:

·         hello_var (str) – hello_var

·         world_var (str) – world_var

Returns:

concatenation of the strings

Return type:

str

但是,在某些情况下,您拥有第三方包装,可以从中获得装饰。但是,修改软件包的源代码并在源代码的各处添加functools.wraps()是不切实际的-至少在下一次更新此软件包后,您所做的工作就会消失。

是否有其他解决方案,不涉及修改从中获取装饰器的第3方程序包(例如Django)的源代码?

一个简单的例子可能像这样。除非您转到Django的源代码并在其中添加save,否则@wraps函数的文档字符串不会被拉出。

from django.db import transaction

@transaction.atomic
def save(self):
    """Docstring to be used"""
    pass

0 个答案:

没有答案