Python 以编程方式为 class 的每个方法设置动态自定义文档字符串

Python programmatically set dynamic custom docstring for each method of the class

我想实现动态调用一个函数并为我生成一个文档字符串并应用于我需要的 class 方法。

示例低于我所拥有的和我想要实现的目标,对于每种方法,我都有一个以三引号开头的文档字符串

目前有以下

class MyClass(BaseHandler, ABC):
    def initialize(self, *args, **kwargs):
        super(MyClass, self).initialize(*args, **kwargs)
        self.description = 'My Class'

    @authenticated()
    @coroutine
    def get(self):
        """
        <div>Method GET</div>
        <div>Description: retrieve list My Class</div>
        """
        # some code here
        self.write({
            'success': True,
            'data': self.description
        })

    @authenticated()
    @coroutine
    def post(self):
        """
        <div>Method POST</div>
        <div>Description: update item My Class</div>
        """
        # some code here
        self.write({
            'success': True,
            'data': self.description
        })

在每个方法中,我都有一个硬编码的文档字符串并且工作正常,但我想实现使用函数插入文档字符串。

想要的结果

def generate_docstring(name, method):
    docstring = """
       <div>Method %s</div>
       <div>Description: retrieve list %s</div>
       """ % (method, name)
    return docstring

class MyClass(BaseHandler, ABC):
    def initialize(self, *args, **kwargs):
        super(MyClass, self).initialize(*args, **kwargs)
        self.description = 'My Class'

    @authenticated()
    @coroutine
    def get(self):
        # but this way does not work
        self.generate_docstring(name=self.description, staticmethod='GET')
        
        # some code here
        self.write({
            'success': True,
            'data': self.description
        })

    @authenticated()
    @coroutine
    def post(self):
        # but this way does not work
        self.generate_docstring(name=self.description, staticmethod='POST')
        
        # some code here
        self.write({
            'success': True,
            'data': self.description
        })

有什么方法可以在每个方法下使用一个函数调用并生成docstring吗?

提前致谢

您可以使用装饰器,但我觉得有一种更简单的方法可以做到这一点。

def generate_docstring(name, method, action):
    def inner(obj):
        obj.__doc__ = """
            <div>Method {method}</div>
            <div>Description: {action} {name}</div>
            """.format(name=name, method=method, action=action)
        return obj
    return inner

class MyClass:
    description = 'My Class'

    @generate_docstring(description, 'GET', 'retrieve list')
    def get(self):
        pass

    @generate_docstring(description, 'POST', 'update item')
    def post(self):
        pass

之后,help(MyClass) 说:

class MyClass(builtins.object)
 |  Methods defined here:
 |  
 |  get(self)
 |      <div>Method GET</div>
 |      <div>Description: retrieve list My Class</div>
 |  
 |  post(self)
 |      <div>Method POST</div>
 |      <div>Description: update item My Class</div>

...