Вероятно, самое простое - сделать это старым добрым способом. Вот некоторый начальный код для начала работы. Он, вероятно, может быть красивее, но должен дать основную идею:
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 или заканчивается ею).
Надеюсь, это дает некоторое представление о том, как можно действовать дальше. Возможно, есть более элегантный способ решения проблемы :)
.Интересно сочетание интроспекции и обработки исходников. Вот непроверенный псевдокод:
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, чтобы он пересматривался, но это дает вам общую идею.
Это может быть излишним для этого простого использования, но я бы посмотрел на использование механизма 2to3 для редактирования. Вам просто нужно написать собственный фиксатор. Это плохо документировано, но Руководство разработчика по Python 3.0: Python 2.6 и переход с 2 на 3: Подробнее о 2to3 и Реализовать специальные исправления дает достаточно подробностей, чтобы начать работу ...
Epydoc, похоже, содержит метод to_rst ()
, который может помочь вам действительно перевести строки документации. Не знаю, хорошо ли это ...