Замена [закрытых] docstrings Python

6
задан tomaz 19 March 2010 в 14:12
поделиться

3 ответа

Вероятно, самое простое - сделать это старым добрым способом. Вот некоторый начальный код для начала работы. Он, вероятно, может быть красивее, но должен дать основную идею:

def is_docstr_bound(line):
    return "'''" in line or  '"""' in line

# XXX: output using the same name to some other folder
output = open('output.py', 'w')

docstr_found = False
docstr = list()
with open('input.py') as f:
    for line in f.readlines():
        if docstr_found:
            if is_docstr_bound(line):
                # XXX: do conversion now
                # ...

                # and write to output
                output.write(''.join(docstr))

                output.write(line)

                docstr = list()
                docstr_found = False
            else:
                docstr.append(line)
        else:
            if is_docstr_bound(line):
                docstr_found = True

            output.write(line)

output.close()

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

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

Надеюсь, это дает некоторое представление о том, как можно действовать дальше. Возможно, есть более элегантный способ решения проблемы :)

.
0
ответ дан 17 December 2019 в 02:26
поделиться

Интересно сочетание интроспекции и обработки исходников. Вот непроверенный псевдокод:

import foo #where foo is your module

with open('foo.py',r) as f:
    src = f.readlines()

for pything in dir(foo):  #probably better ways to do this...
    try:
       docstring = pything.__doc__
    except AttributeError:
       #no docstring here
       pass

    #modify the docstring
    new_docstring = my_format_changer(docstring)

    #now replace it in the source
    src = src.replace(docstring, new_docstring)

#When done, write it out
with open('new_foo.py','w') as fout:
    fout.write(src)

Очевидно, что вам придется вложить некоторую хитрость в код, который обходит модуль в поисках объектов, у которых есть docstrings, чтобы он пересматривался, но это дает вам общую идею.

0
ответ дан 17 December 2019 в 02:26
поделиться

Это может быть излишним для этого простого использования, но я бы посмотрел на использование механизма 2to3 для редактирования. Вам просто нужно написать собственный фиксатор. Это плохо документировано, но Руководство разработчика по Python 3.0: Python 2.6 и переход с 2 на 3: Подробнее о 2to3 и Реализовать специальные исправления дает достаточно подробностей, чтобы начать работу ...

Epydoc, похоже, содержит метод to_rst () , который может помочь вам действительно перевести строки документации. Не знаю, хорошо ли это ...

2
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: