【发布时间】:2015-04-06 15:46:20
【问题描述】:
如何将*args 和**kwargs 替换为修饰函数文档中的真实签名?
假设我有以下装饰器和装饰功能:
import functools
def mywrapper(func):
@functools.wraps(func)
def new_func(*args, **kwargs):
print('Wrapping Ho!')
return func(*args, **kwargs)
return new_func
@mywrapper
def myfunc(foo=42, bar=43):
"""Obscure Addition
:param foo: bar!
:param bar: bla bla
:return: foo + bar
"""
return foo + bar
因此,调用print(myfunc(3, 4)) 给我们:
Wrapping Ho!
7
到目前为止一切顺利。我还希望我的库包含 myfunc 正确记录在 Sphinx 中。
但是,如果我通过以下方式将我的函数包含在我的 sphinx html 页面中:
.. automodule:: mymodule
:members: myfunc
它实际上会显示为:
myfunc(*args, **kwargs)
模糊添加
-
参数:
- foo:吧!
- 酒吧:bla bla
- 返回: 富+酒吧
我怎样才能摆脱标题中的通用myfunc(*args, **kwargs)?这应该替换为 myfunc(foo=42, bar=43)。如何更改 sphinx 或我的装饰器 mywrapper 以便在文档中保留默认关键字参数?
编辑:
正如之前所指出的,这个问题已经被问过,但答案并没有太大帮助。
但是,我有一个想法,想知道这是否可能。 Sphinx 是否设置了一些环境变量来告诉我的模块它实际上是由 Sphinx 导入的?如果是这样,我可以简单地修补我自己的包装器。如果我的模块是由 Sphinx 导入的,我的包装器会返回原始函数而不是包装它们。因此,签名被保留。
【问题讨论】:
-
抱歉没有找到问题。是的,它是完全相同的。但恐怕答案不是很有帮助。我不想繁琐地手动将所有装饰函数添加到我的 sphinx 文档中。
标签: python decorator python-sphinx python-decorators