【问题标题】:Amending docstrings from decoators, while retaining formattting修改来自装饰器的文档字符串,同时保留格式
【发布时间】:2014-05-08 12:52:19
【问题描述】:

我有一些装饰器函数,它们在执行它们装饰的函数之前/之后执行附加代码。我想做的是动态记录装饰函数文档字符串的附加行为。我已经使用functools.wrap 保留了名称和此类属性。

这是我想做的一个简化示例:

numbers_added = []

def record_number(func):
    decorator_doc = '''\nRecord added numbers in numbers_added'''
    def add_and_record(n):
        r = func(n)
        if r is not False:
            numbers_added.append(n)
        return r
    add_and_record.__doc__ = func.__doc__ + decorator_doc
    return add_and_record

@record_number
def add2_to_even(n):
    '''Add 2 to an even number, `n`.

       If n is not even, return False'''
    if n % 2 == 0:
        return n + 2
    return False

现在,这里的一切都很好,并且文档字符串已成功更新,那么我的问题是什么?如果您查看help(add2_to_even),您会发现文档字符串的第二行格式不正确。通常任何前导缩进都会被剥离,但在这种情况下会被保留。我可以做些什么来保持预期的格式?

注意:在 Python 文档字符串约定 (PEP 257) 中有一个算法实现,但我宁愿不使用类似的东西并重新实现核心功能。

【问题讨论】:

    标签: python documentation decorator python-decorators


    【解决方案1】:

    inspect.cleandoc 函数本质上实现了 PEP 257 中的 trim 算法。您可以使用它来进行修剪。

    由于您的新文档字符串没有缩进,为了将其与旧文档结合,您需要去掉旧文档中的缩进。所以你可能需要做的是修剪现有的文档字符串,然后附加你的新文档。即把record_number的倒数第二行改为:

    add_and_record.__doc__ = inspect.cleandoc(func.__doc__) + decorator_doc
    

    当我尝试使用您的示例时,这给出了正确的结果,尽管我不确定是否会出现边缘情况,它会为格式更复杂的文档字符串提供奇怪的输出。

    【讨论】:

    • 我在代码上试了一下,得到了相同的结果。但是,出于某种原因,我决定尝试使用具有相同初始缩进的两个文档字符串,它给出了预期的结果。此外,在没有 cleandoc 的情况下尝试它,但使用新的缩进修复,它仍然给出了预期的结果。所以,我现在有一些工作,虽然它仍然不完全理想,但如果没有更好的解决方案出现,我可以忍受它。
    • @JohnHill:您需要做的是在现有文档字符串上添加cleandoc,然后附加您的新文档。请参阅我编辑的答案。
    猜你喜欢
    • 2020-06-08
    • 2023-03-18
    • 2019-09-02
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多