Когда я применяю свой собственный декоратор (подробности не важны, но см. ниже) или другие декораторы, такие как cached
, из cachetools, мои документы, сгенерированные Sphinx, не отображают имена аргументов в своих подписях.
Например, документация для
@cached()
def some_func(argA, argB=None):
...
@require_unicode('third')
def another_func(first, second=None, third=None):
...
будет читать, в общем
some_func(*args, **kwargs)
other_func(*args, **kwargs)
а не информативно, как
some_func (argA, argB = нет)
other_func (первый, второй = нет, третий = нет)
Как я могу исправить это, чтобы имена моих аргументов отображались в моей документации по Sphinx? Я понимаю, что это известная проблема, и, поскольку я знаю имена декораторов, которые использую, я подумал просто сделать их неактивными в моем conf.py
, но не могу понять, как это сделать.
Например, что-то вроде это кажется многообещающим, но я не знаю, как заставить его работать. Я могу поставить его перед моим определением выше, но не вижу, как заставить его работать для 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
cached
. - person orome   schedule 29.11.2015cached
wraps
, и там же залатать его. - person jonrsharpe   schedule 29.11.2015