【发布时间】:2026-02-03 08:25:01
【问题描述】:
让我们从这个开始:
class Example(object):
change_docstring = True
@add_to_docstring(" (additional content!)")
def example_method(self):
"""Example docstring."""
pass
我想要做的是允许@add_to_docstring 装饰器将其参数字符串附加到方法的文档字符串中987654326@。我确实不想将其他任何东西传递给装饰器。
此解决方案有效,但不是我想要的。
def add_to_docstring(text):
def decorator(original_method):
def wrapper(self):
"""wrapper docstring."""
wrapper.__doc__ = original_method.__doc__
if self.change_docstring:
wrapper.__doc__ += text
return original_method(self)
return wrapper
return decorator
让我解释一下。
上述解决方案仅在执行example_method 时更改文档字符串。加载类、方法等时,文档字符串不会更改。
>>> Example.example_method.__doc__
"wrapper docstring."
>>>
>>> Example().example_method()
>>> Example.example_method.__doc__
"Example docstring. (additional content!)"
这就是我希望上述命令的输出:
>>> Example.example_method.__doc__
"Example docstring. (additional content!)"
同样,我不想将任何其他内容传递给装饰器。
更新
为了进一步说明,这是为了允许装饰器更改方法的文档字符串,并将该更改反映在 Sphinx 生成的文档中。 Sphinx 加载所有内容并收集文档字符串,但它没有做任何其他事情。
基于选择的解决方案,我在装饰器模块中添加了一个模块变量,并公开了一种方法来禁用装饰器中的文档字符串更改功能。为了普遍禁用该功能,我随后在我的 Sphinx conf.py 文件中调用了该禁用函数,如下所示:
# import the decorators module
from some_modules import decorators
# disable the docstring change feature
decorators.disable_docstring_change()
然后装饰器可以用于项目中的任何方法,文档字符串的更改将被启用或禁用。
【问题讨论】:
-
由于类作用域的工作方式,我认为这是不可能的(不将
change_docstring传递给装饰器,或使其成为全局对象)。有关详细信息,请参阅here。另见*.com/questions/47223764/… -
在很可能不可能的情况下,你有什么建议让装饰者可以使用
change_docstring?本质上,它是一个应该默认为 False 的设置。我只是希望将设置作为类的属性以使其易于设置。 -
如果
change_docstring未设置或为假,为什么不能省略装饰器? -
在这种情况下,装饰器不会做任何其他事情,但在实际情况下,文档字符串的更改将只是装饰器逻辑的一部分。
-
不,您不能在那里访问类本身,因为在执行其定义之前,该类不作为对象存在。
标签: python python-sphinx python-decorators