簡體   English   中英

當一個方法中有兩個裝飾器時,為什么sphinx autodoc輸出裝飾器的文檔字符串?

[英]Why does sphinx autodoc output a decorator's docstring when there are two decorators in a method?

我想使用sphinx autodoc為具有@classproperty@classmethod裝飾器的方法生成文檔。 我得到了@classmethod的文檔,而不是方法的文檔。 如果刪除任何裝飾器,則一切正常。 類代碼的結構如下:

class Example(object):
    @classproperty
    @classmethod
    def example_method(cls):
       """Method description"""
       pass

類屬性裝飾器:

class classproperty(property):
    def __get__(self, obj, type=None):
        return self.fget.__get__(None, type)()

我正在使用生成文檔:

.. autoclass:: Example
    :members:

Sphinx文檔中

注意

如果要記錄修飾的函數或方法,請記住,自動文檔通過導入模塊並檢查給定函數或方法的doc屬性來檢索其文檔字符串。 這意味着,如果裝飾器將裝飾的功能替換為另一個,則必須將原始文檔復制到新功能。

從Python 2.5開始,functools.wraps()可用於創建行為良好的裝飾函數。

因此,我認為這里的問題是裝飾器在包裝函數時會丟棄docstring。 wraps應該能夠幫助您。

您可以遵循該主題的Python文檔中的模式。 對於您的用例,您可以這樣做:

from functools import wraps

def classpropertymethod(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        return classproperty(classmethod(f(*args, **kwargs)))
    return wrapper

@classpropertymethod
def example_method(cls):
    """Method description"""
    pass

這將從正確傳遞的example_method獲取文檔字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM