Как избежать повторения строки документации и параметров для подклассов Python?

Рассмотрим следующий пример:

class A:
    """
    Simple
    :param a: parameter a explained
    """
    def __init__(self, a):
        self._a = a


class B(A):
    def __init__(self, a, b):
        """
        More complicated
        :param a: parameter a explained.  <- repetition here
        :param b: parameter b explained.
        """
        super().__init__(a)  # this call will have to change if `A()` does
        self._b = b


class C(A):
    def __init__(self, *args, c, **kwargs):
        """
        More complicated without repetition of documentation
        :param c: parameter c explained.
        """
        super().__init__(*args, **kwargs)
        self._c = c

Что я часто делаю при подклассе, так это то, что происходит для B: повторение документации для A (его суперкласса).

Причина, по которой я это делаю, заключается в том, что если вы этого не сделаете, например, для C, IDE и инструменты документации не могут разрешить полную подпись конструктора и будут предоставлять только подсказки для новых функций, скрывая документацию суперкласса, который все еще применяется. , хотя он работает, как ожидалось.

Чтобы избежать повторения, как в B, как лучше всего в Python создать подкласс для какого-либо другого класса, добавив параметр в конструктор, без необходимости повторять всю документацию суперкласса в подклассе?

Другими словами: как я могу написать класс B, чтобы подсказки параметров в IDE позволяли пользователям этого класса видеть, что он принимает a и b в качестве параметра, без повторного указания всех других параметров, кроме нового b?

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

Кроме того, если подпись A изменяется, вызов super().__init__() в конструкторе Bs также должен измениться, в то время как C продолжает работать до тех пор, пока нет конфликтов (т.е. новый параметр As в конструкторе также не вызывается c).


person Grismar    schedule 22.04.2021    source источник
comment
Не совсем уверен, действительно ли ответы в этом потоке помогут вашему использованию IDE, но вкратце Python никогда не создавался для такой возможности, но его можно эмулировать с помощью методов в этом потоке, будь то декоратор или метакласс.   -  person metatoaster    schedule 22.04.2021
comment
@metatoaster Я полагаю, это дает ответ на часть моего вопроса, касающуюся документации, есть ли у вас какие-либо идеи, как избежать воздействия на вызов super? Т.е. повторять всю подпись в конструкторе подкласса?   -  person Grismar    schedule 22.04.2021
comment
Если не считать изменения способа генерации байт-кода из источника ввода (например, код, выполняемый вызовом super, сворачивается / дублируется в текущую функцию), нет. Альтернативные методы: вы можете попытаться создать какой-либо метакласс, который будет манипулировать всеми входными вызываемыми объектами таким образом, чтобы у них был правильный __doc__ (но это не решает проблему IDE), или посредством генерации какого-либо шаблона кода. Поскольку IDE Python, как правило, полагаются на статические записи внутри исходных файлов, Python не имеет врожденной концепции наследования строк документации (хотя инструменты docgen, такие как sphinx, эмулируют ее).   -  person metatoaster    schedule 22.04.2021
comment
Еще более ранний поток, в котором один из более поздних ответов представил _ 1_, который может или не может соответствовать вашему варианту использования.   -  person metatoaster    schedule 22.04.2021