Python программно устанавливает динамику c настраиваемую строку документации для каждого метода класса - PullRequest
0 голосов
/ 06 августа 2020

Я хочу добиться динамического вызова функции и создания мне строки документации и ее применения для методов класса, которые мне нужны.

Ниже приведен пример того, что у меня есть и чего я хочу достичь , для каждого метода у меня есть строка документации, которая начинается с тройных кавычек

В настоящее время есть следующие

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
        })

Там есть ли способ использовать функцию и вызывать для каждого метода и генерировать строку документации?

Заранее спасибо

1 Ответ

1 голос
/ 06 августа 2020

Вы можете использовать декоратор, хотя мне кажется, что есть более простой способ сделать это.

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>

...
...