Как программно изменить строки документации в файле

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

Итак, скажем, у меня есть следующее:

# a bunch of code

class A:
    """A good class.

    Parameters
    ----------
    p : int
        A powerful parameter.

    q : float, optional
        An even more powerful parameter.
    """
    def __init__(self, p=3, q=.3):
        self.p = p
        self.q = q

# a bunch of more code

Мне нужно просмотреть весь файл, найти все такие экземпляры и изменить их на:

# a bunch of code

class A:
    """A good class.

    Parameters
    ----------
    p : int, optional (default=3)
        A powerful parameter.

    q : float, optional (default=.3)
        An even more powerful parameter.
    """
    def __init__(self, p=3, q=.3):
        self.p = p
        self.q = q

# a bunch of more code

А затем сохраните его обратно в тот же или другой файл.

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


person adrin    schedule 18.09.2018    source источник
comment
Я считаю, что этого плюс парсер должно быть достаточно stackoverflow .com/questions/713138/ (в основном измените строку документации на что угодно, работа в синтаксическом анализаторе, который вам придется написать)   -  person E.Serra    schedule 18.09.2018


Ответы (1)


Это именно то, что вы хотите сделать:

1- Получите доступ к строке документации каждого метода и измените ее, чтобы включить значения по умолчанию.

для этого требуется: 1.1- Список атрибутов 1.2- Что-то делать с каждым атрибутом

modify = [a for a in dir(A) if not (a.startswith('__') and a.endswith('__'))]

(Конечно, есть способ проверить, является ли атрибут приватным, это просто быстрый способ)

Затем, чтобы изменить список атрибутов, которые вы хотите изменить по умолчанию, используйте inspect:

import inspect

inspect.getfullargspec(<YOURATTRIBUTE HERE>)

FullArgSpec(args=['self', 'p', 'q'], varargs=None, varkw=None, defaults=(3, .3), kwonlyargs=[], kwonlydefaults=None, annotations={})

Все, что вам нужно сделать сейчас, это использовать эту информацию для изменения строки документации.

person E.Serra    schedule 18.09.2018
comment
Да, это та часть, которую я знал. 1. вы предполагаете, что мне дан объект или имя класса, но мне дан файл, и мне нужно сохранить все остальное, чего я не касаюсь в файле, например, комментарии в начале и т. д. 2. Я знаю, что это не так уж сложно, но я надеюсь, что мне не придется самостоятельно разбирать строки документации. Я видел конвейеры CI (думаю, Circle-ci или travis-ci), которые также проверяли строки документации. Так что я надеюсь использовать то, что они используют для этого дела. - person adrin; 18.09.2018