Sphinx文档不列出修饰函数的参数

时间:2015-11-28 23:03:05

标签: python python-2.7 python-sphinx python-decorators

当我从cachetools应用我自己的装饰器(细节不重要,但见下文)或其他装饰器(如cached)时,我的Sphinx生成的文档不会在其签名中显示参数名称。

例如,

的文档
@cached()
def some_func(argA, argB=None):
    ...

@require_unicode('third')
def another_func(first, second=None, third=None):
...

将阅读,一般

  

some_func(* args,** kwargs)

     

another_func(* args,** kwargs)

而不是信息性的

  

some_func(argA,argB =无)

     

another_func(first,second = None,third = None)

如何解决这个问题,以便我的参数名称出现在我的Sphinx文档中?我知道这是一个已知的问题,因为我知道我使用的装饰器的名称,我想在我的conf.py中将它们变成无操作,但无法弄清楚怎么做那个。

例如,像this这样的东西似乎很有希望,但我不知道如何让它发挥作用。我可以在上面的定义之前提出它,但看不到如何让它适用于cached

我的装饰师,供参考。请注意,至少这会生成文档(如果我不使用wraps则不会生成):

from functools import wraps

def require_unicode(*given_arg_names):
    def check_types(_func_):
        @wraps(_func_)
        def modified(*args, **kwargs):
            arg_names = list(_func_.func_code.co_varnames[:_func_.func_code.co_argcount])
            if len(given_arg_names) == 0:
                raise TypeError('No arguments provided to require_unicode decorator.')
                #unicode_arg_names = arg_names
            else:
                unicode_arg_names = given_arg_names
            for unicode_arg_name in unicode_arg_names:
                try:
                    arg_index = arg_names.index(unicode_arg_name)
                    if len(args) > arg_index:
                        arg = args[arg_index]
                    elif unicode_arg_name in kwargs:
                        arg = kwargs[unicode_arg_name]
                    else:
                    if not isinstance(arg, unicode):
                        raise TypeError("Parameter '{}' should be Unicode".format(unicode_arg_name))
                except ValueError:
                    raise NameError(unicode_arg_name)
            return _func_(*args, **kwargs)
        return modified
    return check_types

1 个答案:

答案 0 :(得分:1)

查看source code for cached,它不会使用functools.wraps,因此您当前的猴子补丁在那里不会成功。它使用functools.update_wrapper或其自己的版本,别名为_update_wrapper,因此您需要修补它。如果您正在使用任何其他库以及他们自己实现包装的方式,那么您需要相应地调查每个库。