当我从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
答案 0 :(得分:1)
查看source code for cached
,它不会使用functools.wraps
,因此您当前的猴子补丁在那里不会成功。它使用functools.update_wrapper
或其自己的版本,别名为_update_wrapper
,因此您需要修补它。如果您正在使用任何其他库以及他们自己实现包装的方式,那么您需要相应地调查每个库。