Документирование и детализация одного сценария на основе комментариев внутри - PullRequest
6 голосов
/ 13 июля 2020

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

# -*- coding: utf-8 -*-
"""
Small description and information
@author: Author
"""

# Imports
import numpy as np
import math
from scipy import signal
...

# Constant definition (always with variable in capital letters)
CONSTANT_1 = 5
CONSTANT_2 = 10

# Main class
class Test():
    def __init__(self, run_id, parameters):
        # Some stuff not too important
        
    def _run(self, parameters):
        # Main program returning a result object. 

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

Например, в методе _run() может быть несколько шаги, подробно описанные в комментариях:

def _run(self, parameters):
        # Step 1: we start by doing this
        code to do it
            
        # Step 2: then we do this
        code to do it
        code 
        code # this code does that

Какую библиотеку / парсер я мог бы использовать для анализа python скрипта и вывода PDF-файла? Сначала я думал о sphinx , но он не подходит для моих нужд, так как мне пришлось бы разрабатывать собственное расширение. Более того, сила sphinx заключается в связях и иерархии между несколькими скриптами одного или разных модулей. В моем случае я буду документировать только один скрипт, по одному файлу за раз.

Тогда моя вторая идея - использовать формат RST и RST2PDF для создать PDF. Затем для парсера я мог бы разработать парсер, который считывает файл .py и извлекает закомментированные / украшенные строки или набор строк, как предложено ниже, а затем записывает файл RST .

#-description
## Title of something
# doing this here
#-

#-code
some code to extract and put in the doc
some more code
#-

Наконец, я также хотел бы иметь возможность выполнить некоторый код и уловить результат, чтобы поместить его в выходной файл PDF. Например, я мог бы запустить код python для вычисления SHA1 ha sh содержимого файла .py и включить его в качестве ссылки в документацию PDF.

Ответы [ 3 ]

3 голосов
/ 20 июля 2020

Строки документов вместо комментариев

Чтобы упростить себе задачу, вы, вероятно, захотите использовать строки документов вместо комментариев:

A docstring - это строковый литерал, который встречается как первая инструкция в определении модуля, функции, класса или метода. Такая строка документации становится специальным атрибутом __doc__ этого объекта.

Таким образом, вы можете использовать атрибут __doc__ при синтаксическом анализе скриптов при создании документации.

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

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

def with_steps(func):
  def add_step(n, doc):
    func.__doc__ = func.__doc__ + "\nStep %d: %s" % (n, doc)
  func.add_step = add_step

@with_steps
def _run(self, parameters):
  """Initial description that is turned into the initial docstring"""
  _run.add_step(1, "we start by doing this")
  code to do it
        
  _run.add_step(2, "then we do this")
  code to do it
  code 

, что создаст такую ​​строку документации:

Начальное описание, которое превращается в исходную строку документации
Шаг 1: мы начинаем с этого
Шаг 2: затем делаем это

Вы поняли.

Создание PDF из задокументированных скриптов

Sphinx

Лично я бы просто попробовал PDF-Builders, доступные для Sphinx, через LaTeXBuilder или используя rinoh , если вы не хотите зависеть от LaTeX.

Однако вам придется использовать формат строки документации, который понимает Sphinx, например reStructuredText или строки документации Google Style.

AST

Альтернативой является использование ast для извлечения строк документации. Вероятно, это то, что расширение Sphinx autodo c использует внутренне для извлечения документации из исходных файлов. Есть несколько примеров того, как это сделать, например this gist или this blog post .

Таким образом вы можете написать скрипт, который анализирует и выводит любые нужные вам форматы. Например, вы можете вывести Markdown или reST и преобразовать его в PDF, используя pando c.

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

def _run(self, parameters):
  """Example script
  ================

  This script does a, b, c

  1. Does something first
  2. Does something else next
  3. Returns something else

  Usage example:
  
      result = script(parameters)
      foo = [r.foo for r in results]
  """

Эта строка может быть извлечена с помощью ast и проанализирована / обработана с использованием любой библиотеки, которую вы сочтете подходящей.

3 голосов
/ 20 июля 2020

Doxygen кажется подходящим для этого. Он поддерживает Python строк документации, а также может анализировать комментарии, начинающиеся с ##, как описано здесь:

https://www.doxygen.nl/manual/docblocks.html#pythonblocks

Чтобы получить результат в формате PDF. вам нужно установить процессор LaTeX, например MikTex. Когда вы запустите Doxygen, он создаст папку latex, которая включает сценарий оболочки «make». Запустите сценарий оболочки, и файл PDF будет сгенерирован,.

Чтобы включить содержимое, созданное где-то еще, например, упомянутые вами хэши SHA1, вы можете использовать команду @include в комментарии. Обратите внимание, что команды Doxygen @include будут работать, только если вы используете ## комментарии.

например,

## Documentation for a class.
#
#  More details.
#  @include PyClassSha1Hash.txt
class PyClass:
3 голосов
/ 20 июля 2020

Комментарии не подходят для документации, обычно они используются для выделения конкретных c аспектов, имеющих отношение только к разработчикам (а не пользователям). Для достижения своей цели вы можете использовать __doc__ строки в разных местах:

  • уровень модуля
  • уровень класса
  • уровень функции / метода

В случае, если ваш метод _run действительно длинный, и вы чувствуете, что do c -строка слишком далеко от фактического кода, это сильный признак того, что ваша функция в любом случае слишком длинная. Для большей ясности его следует разделить на несколько более мелких функций, каждая из которых может иметь свою строку do c. Например, Руководство по стилю Google предлагает, чтобы, если функция превышает 40 строк кода, она должна быть разбита на более мелкие части.

Тогда вы можете использовать, например, Sphinx чтобы проанализировать эту документацию и преобразовать ее в формат PDF.

Вот пример настройки (с использованием Google do c style ):

# -*- coding: utf-8 -*-
"""
Small description and information.
@author: Author

Attributes:
    CONSTANT_1 (int): Some description.
    CONSTANT_2 (int): Some description.
"""

import numpy as np
import math
from scipy import signal


CONSTANT_1 = 5
CONSTANT_2 = 10


class Test():
    """Main class."""
    def __init__(self, run_id, parameters):
        """Some stuff not too important."""
        pass
        
    def _run(self, parameters):
        """Main program returning a result object.

        Uses `func1` to compute X and then `func2` to convert it to Y.

        Args:
            parameters (dict): Parameters for the computation

        Returns:
            result
        """
        X = self.func1(parameters)
        Y = self.func2(X)
        return Y

    def func1(self, p):
        """Information on this method."""
        pass

    def func2(self, x):
        """Information on this method."""
        pass

Затем с Sphinx вы можно использовать утилиту командной строки sphinx-quickstart для настройки образца проекта. Для создания документации к скрипту вы можете использовать sphinx-apidoc. Для этого вы можете создать отдельный каталог scripts, добавить пустой файл __init__.py и поместить все свои скрипты в этот каталог. После выполнения этих шагов структура каталогов будет выглядеть следующим образом (при условии, что вы не разделили каталоги сборки и исходного кода во время sphinx-quickstart (по умолчанию)):

$ tree
.
├── _build
├── conf.py
├── index.rst
├── make.bat
├── Makefile
├── scripts
│   └── __init__.py
│   └── example.py
├── _static
└── _templates

Для работы sphinx-apidoc , вам необходимо включить расширение sphinx-autodoc. В зависимости от того, какой стиль do c вы используете, вам может также потребоваться включить соответствующее расширение. В приведенном выше примере используется стиль Google do c, который обрабатывается расширением Napoleon . Эти расширения можно включить в conf.py:

extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon']

Затем вы можете запустить sphinx-apidoc следующим образом (-e помещает каждый модуль / скрипт на отдельную страницу, -f перезаписывает существующие do c files, -P документирует частные члены (начинающиеся с _)):

$ sphinx-apidoc -efPo api scripts/
Creating file api/scripts.rst.
Creating file api/scripts.example.rst.
Creating file api/modules.rst.

Эта команда создала необходимые инструкции для самой команды сборки. Чтобы сборка также могла импортировать и правильно документировать ваши сценарии, вам также необходимо соответствующим образом указать путь импорта. Это можно сделать, раскомментировав следующие три строки вверху в conf.py:

import os
import sys
sys.path.insert(0, os.path.abspath('.'))

Чтобы документы ваших скриптов отображались в документации, вам необходимо связать их из основного файла index.rst. :

Welcome to ExampleProject's documentation!
==========================================

.. toctree::
   :maxdepth: 2
   :caption: Contents:

   api/modules

В конце концов вы можете запустить команду сборки:

$ make latexpdf

Затем итоговую документацию можно будет найти по адресу _build/latex/<your-project-name>.pdf.

Это снимок экрана итоговая документация:

Example APIdoc

Note that there are various темы доступны для изменения внешнего вида вашей документации. Sphinx также поддерживает множество параметров конфигурации для настройки сборки вашей документации.

...