为什么我无法使用 sphinx python 包打印文档字符串?
Why am I unable to get docstring printed out using sphinx python package?
我正在使用 Sphinx 来记录我的函数。但是,它不会使用装饰器读取我的文档字符串。
Sphinx 只是将函数文档字符串替换为 <The magic happens here>
我的函数是用装饰器以这种方式编写的。如何让 Sphinx 检测函数中的文档字符串。
文件夹是这种格式
- 项目
- 函数
- 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
我正在使用 Sphinx 来记录我的函数。但是,它不会使用装饰器读取我的文档字符串。
Sphinx 只是将函数文档字符串替换为 <The magic happens here>
我的函数是用装饰器以这种方式编写的。如何让 Sphinx 检测函数中的文档字符串。
文件夹是这种格式
- 项目
- 函数
- 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