Ответ 1
Я бы сделал это.
Начиная с этого кода.
def foo(
flab_nickers, # a series of under garments to process
has_polka_dots=False,
needs_pressing=False # Whether the list of garments should all be pressed
):
...
Я бы написал парсер, который захватывает определения параметров функции и строит следующее:
def foo(
flab_nickers,
has_polka_dots=False,
needs_pressing=False,
):
"""foo
:param flab_nickers: a series of under garments to process
:type flab_nickers: list or tuple
:param has_polka_dots: default False
:type has_polka_dots: bool
:param needs_pressing: default False, Whether the list of garments should all be pressed
:type needs_pressing: bool
"""
...
Это довольно простая прямолинейная обработка регулярных выражений различных шаблонов строк аргументов, чтобы заполнить шаблон документации.
Много хороших IDE Python (например, PyCharm) понимают стандартную нотацию Sphinx param
и даже флаги vars/methods в области, которую, по мнению IDE, не соответствует объявленному типу.
Обратите внимание на дополнительную запятую в коде; это просто для того, чтобы все было согласовано. Это не вредит, и в будущем это может упростить.
Вы также можете попробовать и использовать компилятор Python, чтобы получить дерево синтаксического анализа, пересмотреть его и испустить код обновления. Я сделал это для других языков (не Python), поэтому я немного об этом знаю, но не знаю, насколько хорошо это поддерживается в Python.
Кроме того, это одноразовое преобразование.
Оригинальные встроенные комментарии в определении функции действительно не соответствуют DRY, потому что это комментарий на неформальном языке и непригодный для использования любыми, но самыми сложными инструментами.
Комментарии Sphinx ближе к DRY, потому что они находятся на языке разметки RST, что упрощает их обработку с использованием обычных инструментов разбора текста в docutils
.
Это только СУХОЕ, если инструменты могут его использовать.
Полезные ссылки: https://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions http://sphinx-doc.org/domains.html#id1