我使用Sphinx来记录我的函数。然而,它不读取我的文档字符串函数与装饰器。Sphinx将函数文档字符串替换为<The magic happens here>
我的函数是这样用装饰符编写的。如何让Sphinx检测函数中的doc字符串。
文件夹是这个格式
- 项目
- 功能——function.py
- 文档
- 功能——function.py
def wrap(pre, post):
""" Wrapper """
def decorate(func):
""" Decorator """
def call(*args, **kwargs):
""" The magic happens here """
pre(func)
result = func(*args, **kwargs)
post(func)
return result
return call
return decorate
def entering(func, *args):
""" Pre function logging """
logging.debug("Entered {}".format(func.__name__))
# logging.info(func.__doc__)
logging.debug("Function at line {} in {}".format(func.__code__.co_firstlineno, func.__code__.co_filename))
try:
logging.debug("The argument {} is {}".format(func.__code__.co_varnames[0], *args))
except IndexError:
logging.debug("No arguments")
def exiting(func):
""" Post function logging """
logging.debug("Exited {}".format(func.__name__))
@wrap(entering, exiting)
def function(a, b):
"""
Function to execute
:param a:
:param b:
:return: Sum of a+b
"""
return a+b
您需要您的decorate
函数将文档字符串从func
复制到call
,然后返回它。否则Sphinx只能得到call
的docstring,而不能得到原函数的docstring。
您可以通过直接执行call.__doc__ = func.__doc__
来完成此操作,或者您可以使用标准库中的functools.wraps
装饰器来为您完成此操作(默认情况下还会复制一些其他属性,并且可以自定义相当多)。
我尝试:
import functools
def wrap(pre, post):
""" Wrapper """
def decorate(func):
""" Decorator """
@functools.wraps(func) # this copies over the docstring and more
def call(*args, **kwargs):
""" The magic happens here """
pre(func)
result = func(*args, **kwargs)
post(func)
return result
return call
return decorate