Sphinx – генерация документации

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение

Качественная документация — это не просто дополнение, а основа успешного проекта. Она помогает новым пользователям разобраться с API, ускоряет разработку и облегчает поддержку. Sphinx – генерация документации — это мощный инструмент, который автоматизирует создание и сборку документации из исходного кода Python.

Sphinx используется для официальной документации Python, NumPy, Django и многих других крупных проектов. Он поддерживает как ручное написание, так и автоматическую генерацию документации из docstring, что делает его универсальным решением для документирования кода любой сложности.

Что такое Sphinx и почему он важен

Sphinx — это генератор документации, написанный на Python, который преобразует исходный код и текстовые файлы в красивую, структурированную документацию в различных форматах. Основное преимущество Sphinx заключается в его способности автоматически извлекать документацию из docstrings Python-кода, что позволяет поддерживать актуальность документации синхронно с кодом.

Основные преимущества Sphinx

Sphinx предоставляет множество возможностей, которые делают его предпочтительным выбором для документирования:

  • Автоматическая генерация из docstrings Python-кода
  • Множество выходных форматов: HTML, PDF, ePub, LaTeX
  • Расширяемость через систему плагинов
  • Интеграция с системами контроля версий и CI/CD
  • Кроссплатформенность и простота использования

Установка и начальная настройка

Установка Sphinx

Для начала работы с Sphinx необходимо установить основной пакет:

pip install sphinx

Для расширенной функциональности рекомендуется также установить дополнительные пакеты:

pip install sphinx sphinx-rtd-theme myst-parser

Инициализация документации

Создание базовой структуры проекта документации выполняется командой:

sphinx-quickstart

Интерактивный мастер настройки предложит выбрать:

  • Название проекта и автора
  • Версию проекта
  • Язык документации
  • Расположение исходных файлов
  • Формат документации (reStructuredText по умолчанию)

После завершения настройки будет создана следующая структура:

docs/
├── _build/          # Готовая документация
├── _static/         # Статические файлы (CSS, JS, изображения)
├── _templates/      # Шаблоны для кастомизации
├── conf.py         # Конфигурационный файл
├── index.rst       # Главная страница
└── Makefile        # Файл сборки

Структура проекта документации

Основные компоненты

conf.py — центральный конфигурационный файл, который управляет всеми аспектами генерации документации. Здесь настраиваются расширения, темы оформления, пути к исходному коду и множество других параметров.

index.rst — корневой файл документации, который служит оглавлением и точкой входа для навигации по всей документации.

_build/ — каталог, где размещается готовая документация в различных форматах (HTML, PDF, ePub и других).

_static/ и _templates/ — папки для пользовательских стилей CSS, JavaScript-файлов и HTML-шаблонов для кастомизации внешнего вида документации.

Конфигурация conf.py

Основные параметры конфигурации включают:

# Основная информация о проекте
project = 'My Project'
author = 'Author Name'
version = '1.0'
release = '1.0.0'

# Расширения
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.napoleon',
    'sphinx.ext.viewcode',
    'sphinx.ext.intersphinx',
]

# Тема оформления
html_theme = 'sphinx_rtd_theme'

# Пути к исходному коду
import os
import sys
sys.path.insert(0, os.path.abspath('../src'))

Автоматическое документирование Python-кода

Подключение расширения autodoc

Для автоматической генерации документации из docstrings необходимо подключить соответствующие расширения:

# В conf.py
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.napoleon',
    'sphinx.ext.viewcode',
]

Настройка путей к модулям

Добавьте путь к вашим Python-модулям в conf.py:

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

Автоматическая генерация API-документации

Для создания файлов документации для всех модулей используйте:

sphinx-apidoc -o source/ ../src/

Эта команда создаст .rst файлы для всех найденных Python-модулей и классов.

Настройка autodoc

Дополнительные параметры для тонкой настройки autodoc:

# Автоматическая документация членов класса
autodoc_default_options = {
    'members': True,
    'member-order': 'bysource',
    'special-members': '__init__',
    'undoc-members': True,
    'exclude-members': '__weakref__'
}

Работа с reStructuredText (reST)

Основной синтаксис

reStructuredText является основным форматом разметки для Sphinx. Основные элементы синтаксиса:

Заголовок первого уровня
========================

Заголовок второго уровня
------------------------

Заголовок третьего уровня
~~~~~~~~~~~~~~~~~~~~~~~~~

**Полужирный текст**, *курсив*, ``моноширинный шрифт``

Списки:

* Элемент списка
* Другой элемент

1. Нумерованный список
2. Второй элемент

Ссылки:

`Внешняя ссылка <https://example.com>`_

:doc:`Внутренняя ссылка <другой_документ>`

Блоки кода:

.. code-block:: python

    def hello():
        print("Hello, World!")

Директивы Sphinx

Sphinx расширяет reStructuredText специальными директивами:

.. automodule:: mymodule
   :members:
   :undoc-members:
   :show-inheritance:

.. autoclass:: MyClass
   :members:
   :inherited-members:

.. autofunction:: my_function

.. note::
   Это важная заметка.

.. warning::
   Это предупреждение.

.. seealso::
   Смотрите также эти разделы.

Интеграция с Markdown и MyST

Установка поддержки Markdown

Для работы с Markdown-файлами установите MyST-parser:

pip install myst-parser

Настройка в conf.py

extensions = ['myst_parser']

# Поддержка различных форматов
source_suffix = {
    '.rst': 'restructuredtext',
    '.md': 'markdown',
}

# Настройки MyST
myst_enable_extensions = [
    "deflist",
    "tasklist",
    "html_admonition",
    "html_image",
]

Возможности MyST

MyST позволяет использовать расширенный синтаксис Markdown с поддержкой директив Sphinx:

# Заголовок

```{note}
Заметка в Markdown
def example():
    return "Hello"


## Темы оформления и кастомизация

### Популярные темы

**Read the Docs Theme** — наиболее популярная тема:

```bash
pip install sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'

Furo — современная и минималистичная тема:

pip install furo
html_theme = 'furo'

Настройка темы

Большинство тем поддерживают кастомизацию через переменные:

html_theme_options = {
    'navigation_depth': 4,
    'collapse_navigation': False,
    'sticky_navigation': True,
    'includehidden': True,
    'titles_only': False,
    'logo_only': False,
    'display_version': True,
}

# Кастомные CSS и JavaScript
html_static_path = ['_static']
html_css_files = ['custom.css']
html_js_files = ['custom.js']

Создание пользовательских стилей

Создайте файл _static/custom.css:

/* Кастомные стили */
.wy-nav-content {
    max-width: 1200px;
}

.rst-content .section > h1 {
    margin-bottom: 24px;
    color: #2c3e50;
}

Расширения и плагины Sphinx

Основные расширения

Расширение Назначение
sphinx.ext.autodoc Автоматическая документация из docstrings
sphinx.ext.napoleon Поддержка Google/NumPy-style docstrings
sphinx.ext.viewcode Ссылки на исходный код
sphinx.ext.intersphinx Межпроектные ссылки
sphinx.ext.todo Заметки TODO
sphinx.ext.coverage Покрытие документации
sphinx.ext.doctest Тестирование примеров кода
sphinx.ext.mathjax Математические формулы

Полезные сторонние расширения

Расширение Назначение
sphinx-copybutton Кнопка копирования в блоках кода
sphinx-autodoc-typehints Автоматические аннотации типов
sphinx-tabs Табулированный контент
sphinx-design Современные компоненты UI
sphinxcontrib-mermaid Диаграммы Mermaid

Настройка расширений

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.napoleon',
    'sphinx.ext.viewcode',
    'sphinx.ext.intersphinx',
    'sphinx.ext.todo',
    'sphinx_copybutton',
    'sphinx_autodoc_typehints',
]

# Настройки для TODO
todo_include_todos = True

# Настройки для intersphinx
intersphinx_mapping = {
    'python': ('https://docs.python.org/3', None),
    'numpy': ('https://numpy.org/doc/stable/', None),
    'pandas': ('https://pandas.pydata.org/docs/', None),
}

Методы и функции Sphinx

Основные методы autodoc

Метод Описание Пример использования
.. automodule:: Документирует весь модуль .. automodule:: mymodule
.. autoclass:: Документирует класс .. autoclass:: MyClass
.. autofunction:: Документирует функцию .. autofunction:: my_function
.. automethod:: Документирует метод .. automethod:: MyClass.method
.. autodata:: Документирует переменную .. autodata:: MY_CONSTANT
.. autoexception:: Документирует исключение .. autoexception:: MyError

Опции для autodoc

Опция Описание
:members: Включить все публичные члены
:undoc-members: Включить недокументированные члены
:show-inheritance: Показать наследование
:private-members: Включить приватные члены
:special-members: Включить специальные методы
:inherited-members: Включить унаследованные члены
:exclude-members: Исключить определенные члены

Директивы для перекрестных ссылок

Директива Описание Пример
:doc: Ссылка на документ :doc:guide```
:ref: Ссылка на метку :ref:section-label```
:class: Ссылка на класс :class:MyClass```
:func: Ссылка на функцию :func:function_name```
:meth: Ссылка на метод :meth:MyClass.method```
:attr: Ссылка на атрибут :attr:MyClass.attribute```
:exc: Ссылка на исключение :exc:ValueError```

Связь с внешними библиотеками

Настройка intersphinx

intersphinx_mapping = {
    'python': ('https://docs.python.org/3', None),
    'numpy': ('https://numpy.org/doc/stable/', None),
    'pandas': ('https://pandas.pydata.org/docs/', None),
    'matplotlib': ('https://matplotlib.org/stable/', None),
    'requests': ('https://requests.readthedocs.io/en/latest/', None),
}

Использование внешних ссылок

Функция использует :class:`numpy.ndarray` для обработки данных.
Для HTTP-запросов применяется :class:`requests.Session`.

Сборка документации

Основные команды сборки

Команда Описание
make html Сборка HTML-документации
make latexpdf Сборка PDF через LaTeX
make epub Сборка ePub
make clean Очистка сборки
make linkcheck Проверка ссылок

Ручная сборка

# Сборка HTML
sphinx-build -b html source/ build/html

# Сборка PDF
sphinx-build -b latex source/ build/latex
cd build/latex && make

# Сборка с выводом предупреждений
sphinx-build -W -b html source/ build/html

Настройка сборки

# В conf.py
html_output_encoding = 'utf-8'
html_use_index = True
html_split_index = True
html_show_sourcelink = True
html_show_sphinx = True
html_show_copyright = True

# Исключение файлов из сборки
exclude_patterns = ['_build', '**.ipynb_checkpoints']

Автоматизация и CI/CD

GitHub Actions

Создайте файл .github/workflows/docs.yml:

name: Documentation

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  docs:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.9'
    
    - name: Install dependencies
      run: |
        pip install sphinx sphinx-rtd-theme myst-parser
        pip install -r requirements.txt
    
    - name: Build documentation
      run: |
        cd docs
        make html
    
    - name: Deploy to GitHub Pages
      if: github.ref == 'refs/heads/main'
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./docs/_build/html

GitLab CI

Создайте файл .gitlab-ci.yml:

stages:
  - docs

docs:
  stage: docs
  image: python:3.9
  script:
    - pip install sphinx sphinx-rtd-theme myst-parser
    - pip install -r requirements.txt
    - cd docs
    - make html
  artifacts:
    paths:
      - docs/_build/html
  only:
    - main

Публикация документации

Read the Docs

Read the Docs — это популярная платформа для хостинга документации:

  1. Зарегистрируйтесь на readthedocs.org
  2. Подключите ваш Git-репозиторий
  3. Создайте файл requirements.txt с зависимостями
  4. Настройте файл .readthedocs.yml

Пример .readthedocs.yml:

version: 2

build:
  os: ubuntu-22.04
  tools:
    python: "3.9"

sphinx:
  configuration: docs/conf.py

python:
  install:
    - requirements: requirements.txt
    - method: pip
      path: .

GitHub Pages

Для публикации на GitHub Pages:

  1. Создайте ветку gh-pages
  2. Скопируйте содержимое _build/html в корень ветки
  3. Включите GitHub Pages в настройках репозитория

Netlify

Для развертывания на Netlify:

  1. Подключите репозиторий к Netlify
  2. Настройте команду сборки: cd docs && make html
  3. Укажите папку публикации: docs/_build/html

Стили docstring

Google Style

def function(arg1, arg2):
    """Краткое описание функции.
    
    Более подробное описание функции, которое может
    занимать несколько строк.
    
    Args:
        arg1 (str): Описание первого аргумента.
        arg2 (int): Описание второго аргумента.
    
    Returns:
        bool: Описание возвращаемого значения.
    
    Raises:
        ValueError: Описание исключения.
    
    Example:
        >>> function("hello", 42)
        True
    """
    return True

NumPy Style

def function(arg1, arg2):
    """Краткое описание функции.
    
    Более подробное описание функции.
    
    Parameters
    ----------
    arg1 : str
        Описание первого аргумента.
    arg2 : int
        Описание второго аргумента.
    
    Returns
    -------
    bool
        Описание возвращаемого значения.
    
    Raises
    ------
    ValueError
        Описание исключения.
    
    Examples
    --------
    >>> function("hello", 42)
    True
    """
    return True

Sphinx Style

def function(arg1, arg2):
    """Краткое описание функции.
    
    Более подробное описание функции.
    
    :param arg1: Описание первого аргумента
    :type arg1: str
    :param arg2: Описание второго аргумента
    :type arg2: int
    :returns: Описание возвращаемого значения
    :rtype: bool
    :raises ValueError: Описание исключения
    
    .. code-block:: python
    
        >>> function("hello", 42)
        True
    """
    return True

Лучшие практики

Организация структуры

Рекомендуемая структура документации:

docs/
├── conf.py
├── index.rst
├── installation.rst
├── quickstart.rst
├── user_guide/
│   ├── index.rst
│   ├── basic_usage.rst
│   └── advanced_usage.rst
├── api/
│   ├── index.rst
│   └── modules.rst
├── examples/
│   ├── index.rst
│   └── tutorial.rst
├── changelog.rst
└── contributing.rst

Советы по написанию

  1. Начинайте с краткого описания — первая строка должна быть понятной и информативной
  2. Используйте примеры — добавляйте примеры кода для сложных функций
  3. Описывайте параметры — указывайте типы и назначение всех параметров
  4. Документируйте исключения — перечисляйте возможные ошибки
  5. Поддерживайте актуальность — обновляйте документацию вместе с кодом

Проверка качества

Используйте инструменты для проверки качества документации:

# Проверка покрытия документации
sphinx-build -b coverage docs docs/_build/coverage

# Проверка ссылок
sphinx-build -b linkcheck docs docs/_build/linkcheck

# Проверка синтаксиса
sphinx-build -W -b html docs docs/_build/html

Часто задаваемые вопросы

Что такое Sphinx и чем он отличается от других генераторов документации?

Sphinx — это мощный генератор документации, специально разработанный для Python-проектов. Он отличается от других инструментов способностью автоматически извлекать документацию из docstrings, богатой системой расширений и возможностью генерировать документацию в множестве форматов.

Можно ли использовать Markdown вместо reStructuredText?

Да, с помощью расширения MyST-parser можно писать документацию в Markdown. Это позволяет использовать привычный синтаксис Markdown с полной поддержкой директив Sphinx.

Как настроить автоматическую генерацию документации из кода?

Используйте расширение sphinx.ext.autodoc и команду sphinx-apidoc для создания файлов документации. Убедитесь, что пути к вашим модулям правильно настроены в conf.py.

Какую тему оформления выбрать?

Для большинства проектов рекомендуется тема Read the Docs (sphinx_rtd_theme) из-за её популярности и функциональности. Для современных проектов также подходит тема Furo.

Можно ли опубликовать документацию бесплатно?

Да, существует множество бесплатных платформ: Read the Docs, GitHub Pages, GitLab Pages, Netlify. Read the Docs особенно удобен для Python-проектов.

Как интегрировать Sphinx с системами CI/CD?

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

Как добавить математические формулы в документацию?

Используйте расширение sphinx.ext.mathjax или sphinx.ext.imgmath для поддержки LaTeX-формул в документации.

Можно ли создавать диаграммы в Sphinx?

Да, с помощью расширений типа sphinxcontrib-mermaid, sphinxcontrib-plantuml или sphinx.ext.graphviz можно встраивать различные типы диаграмм.

Как обеспечить синхронизацию документации с кодом?

Используйте docstrings в коде, автоматические тесты документации с sphinx.ext.doctest, и настройте CI/CD для автоматической проверки и обновления документации.

Что делать, если сборка документации занимает слишком много времени?

Оптимизируйте процесс сборки, используя инкрементальную сборку, исключая ненужные файлы, и настраивая кеширование в CI/CD системах.

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

Новости