[英]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.