Введение
Качественная документация — это не просто дополнение, а основа успешного проекта. Она помогает новым пользователям разобраться с 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 — это популярная платформа для хостинга документации:
- Зарегистрируйтесь на readthedocs.org
- Подключите ваш Git-репозиторий
- Создайте файл
requirements.txtс зависимостями - Настройте файл
.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:
- Создайте ветку
gh-pages - Скопируйте содержимое
_build/htmlв корень ветки - Включите GitHub Pages в настройках репозитория
Netlify
Для развертывания на Netlify:
- Подключите репозиторий к Netlify
- Настройте команду сборки:
cd docs && make html - Укажите папку публикации:
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
Советы по написанию
- Начинайте с краткого описания — первая строка должна быть понятной и информативной
- Используйте примеры — добавляйте примеры кода для сложных функций
- Описывайте параметры — указывайте типы и назначение всех параметров
- Документируйте исключения — перечисляйте возможные ошибки
- Поддерживайте актуальность — обновляйте документацию вместе с кодом
Проверка качества
Используйте инструменты для проверки качества документации:
# Проверка покрытия документации
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 представляет собой мощный и гибкий инструмент для создания профессиональной документации. Следуя рекомендациям из этого руководства, вы сможете создать качественную документацию, которая будет полезна как для пользователей, так и для разработчиков вашего проекта.
Настоящее и будущее развития ИИ: классической математики уже недостаточно
Эксперты предупредили о рисках фейковой благотворительности с помощью ИИ
В России разработали универсального ИИ-агента для роботов и индустриальных процессов