Docstrings в Python: как писать понятную документацию

Что такое docstring
Docstring — это строка в начале модуля, класса или функции, которая объясняет, что делает код и как им пользоваться. Это не комментарий для разработчика; docstring — это интерфейс для пользователей кода: автоматическая документация, подсказки в IDE и примеры использования.
Краткое определение: Docstring — это встроенная документация в виде строки, доступная через doc и инструменты генерации документации.
Важно: docstring заключают в тройные кавычки (“””…”””) и помещают сразу после заголовка блока кода (def, class или в начале файла для модуля).
Почему docstrings важны
- Поддерживаемость: легче изменять код, когда его назначение описано.
- Коллаборация: командная документация единообразна и понятна всем разработчикам.
- Инструменты: IDE, Sphinx и другие генераторы читают docstrings.
- Тестирование: doctest позволяет встроить рабочие примеры прямо в документацию.
Основные правила хорошего docstring
- Начинайте с краткой сводки в одной строке.
- Пустая строка после сводки для многострочных docstring.
- Описывайте аргументы, возвращаемые значения и возможные исключения.
- Показывайте примеры использования и ожидаемый результат.
- Используйте аннотации типов (PEP 484) по возможности.
- Следуйте выбранному формату (Google, NumPy, reST) и документируйте стиль в CONTRIBUTING.md.
Простые и сложные docstrings — примеры
Однострочный docstring для простой функции:
def multiply(a, b):
"""Умножает два числа и возвращает результат."""
return a * bМногострочный docstring для класса и метода (Google-стиль):
class Car:
"""
Класс, представляющий автомобиль.
Attributes:
mileage (float): Текущий пробег автомобиля в километрах.
"""
def __init__(self, mileage: float):
self.mileage = mileage
def drive(self, miles: float) -> None:
"""
Проезжает указанное количество километров.
Args:
miles (float): Число километров для прохождения.
Returns:
None
"""
self.mileage += milesПопулярные форматы docstring и шаблоны
Ниже — четыре часто используемых формата. Выберите один и применяйте в проекте.
def multiply(a: int, b: int) -> int:
"""
Умножает два числа вместе.
Args:
a (int): Первое число.
b (int): Второе число.
Returns:
int: Произведение a и b.
Examples:
>>> multiply(2, 3)
6
"""
return a * bNumPy
def multiply(a: int, b: int) -> int:
"""
Умножает два числа вместе.
Parameters
----------
a : int
Первое число.
b : int
Второе число.
Returns
-------
int
Произведение a и b.
"""
return a * breStructuredText (reST)
def multiply(a, b):
"""
Умножает два числа вместе.
:param a: Первое число.
:type a: int
:param b: Второе число.
:type b: int
:return: Произведение a и b.
:rtype: int
"""
return a * bEpytext
def multiply(a, b):
"""
Умножает два числа вместе.
@param a: Первое число.
@type a: int
@param b: Второе число.
@type b: int
@return: Произведение a и b.
@rtype: int
"""
return a * bПримечание: Google и NumPy форматы обычно легче читать и чаще используются в современных проектах.
Как включать тесты в docstrings с doctest
doctest ищет в docstring примеры в стиле интерактивной сессии Python и выполняет их. Это удобно для быстрых проверок и демонстраций.
Пример docstring с разделом Examples для doctest:
def multiply(a: int, b: int) -> int:
"""
Умножает два числа вместе.
Examples
--------
>>> multiply(2, 3)
6
>>> multiply(0, 10)
0
>>> multiply(-1, 5)
-5
"""
return a * bЗапускить doctest для файла можно командой:
python -m doctest -v your_module.pyВажно: doctest хорош для наглядных примеров и регрессионных тестов маленьких функций, но он не заменяет полноценные unit-тесты (pytest, unittest).
Генерация документации из docstrings
Sphinx — популярный генератор документации. Базовый подход:
- Установите Sphinx и расширение napoleon, которое поддерживает Google и NumPy форматы:
pip install sphinx sphinx-rtd-theme sphinxcontrib-napoleon- Инициализируйте проект:
sphinx-quickstart- В conf.py включите napoleon:
extensions = [
'sphinx.ext.autodoc',
'sphinxcontrib.napoleon',
]
html_theme = 'sphinx_rtd_theme'- Подключите модули через автодок:
.. automodule:: mypackage.mymodule
:members:
:undoc-members:Sphinx создаст HTML-документацию из ваших docstrings. Это идеальный путь для публичных библиотек и внутренних API.
Лучшие практики и чеклист перед коммитом
- Напишите краткую сводку в первой строке.
- Убедитесь, что аргументы и возвращаемые значения документированы.
- Приведите пример использования (один краткий пример). Если функция публичная — добавьте примеры для краевых случаев.
- Поддерживайте формат проекта (Google/NumPy/reST).
- Запустите doctest и базовые unit-тесты.
- Добавьте ссылку в CHANGELOG или документацию, если поведение изменилось.
Короткий чеклист для ревьюера:
- Соответствует ли docstring выбранному формату?
- Покрыты ли все параметры и исключения?
- Есть ли пример использования для ключевых функций?
- Не раскрывает ли docstring детали реализации, которые должны быть скрыты?
Короткий чеклист для автора:
- Есть ли однострочная сводка?
- Есть ли пустая строка после неё в многострочных docstrings?
- Прописаны ли типы (если релевантно)?
Мини‑методология: как писать хорошую документацию за 10–20 минут
- Опишите цель функции в одной строке.
- Добавьте аргументы и типы (или ссылку на typing). Если параметров нет — пропустите раздел Args.
- Опишите возвращаемое значение и тип.
- Укажите побочные эффекты (изменение состояния, I/O, запись в БД).
- Добавьте 1–2 примера: обычный и краевой случай.
- Запустите doctest и unit-тесты, поправьте ошибки.
- Коммит и ссылка в описании задачи.
Когда docstrings не помогут: ограничения и контрпримеры
- Документация не заменит плохую структуру кода. Если функция слишком длинная — лучше вынести части в отдельные функции.
- Docstrings не могут полностью объяснить архитектурные решения и бизнес-логику — нужен внешний документ (ARCHITECTURE.md).
- Слишком подробные docstrings с внутренними деталями усложняют чтение: держите баланс.
Альтернативы и дополняющие подходы
- README с примерами и общей картиной модуля.
- ARCHITECTURE.md для описания высокоуровневых решений.
- CHANGELOG для описания изменений поведения API.
- Inline-комментарии для тонких реализаций — только если они поясняют мотивацию.
Роль‑ориентированные рекомендации
Разработчик:
- Пиши кратко, делай примеры, поддерживай стиль.
Ревьюер:
- Проверь полноту аргументов и корректность примеров.
Техлид / архитектор:
- Определи формат и включи в CONTRIBUTING.md.
Документатор:
- Настрой Sphinx/ReadTheDocs и CI, чтобы сборка падала при ошибках в документации.
Cheat sheet — быстрая шпаргалка
- Однострочный docstring: для приватных или очень простых функций.
- Многострочный: для публичных API, классов и модулей.
- Формат: Google или NumPy для удобочитаемости.
- Примеры: обязательно для публичных функций.
- Тесты: doctest + unit-тесты.
Примеры шаблонов для копирования
Функция (Google):
def func(arg1: str, arg2: int) -> bool:
"""
Краткое описание.
Args:
arg1 (str): Описание arg1.
arg2 (int): Описание arg2.
Returns:
bool: Описание возвращаемого значения.
Raises:
ValueError: Если arg2 отрицательный.
"""
if arg2 < 0:
raise ValueError("arg2 must be non-negative")
return TrueКласс (NumPy):
class DataProcessor:
"""
Обрабатывает данные для загрузки.
Parameters
----------
config : dict
Конфигурация обработки.
Attributes
----------
config : dict
Текущая конфигурация.
"""
def __init__(self, config: dict):
self.config = configКритерии приёмки
- Docstring присутствует для публичной функции/класса/модуля.
- Есть краткая первая строка и описание параметров.
- Примеры демонстрируют нормальное и краевое поведение.
- doctest и unit-тесты проходят в CI.
Миграция и совместимость
Если вы менять формат docstring в существующем проекте:
- Выберите новый формат и задокументируйте его в CONTRIBUTING.md.
- Автоматизируйте проверку линтером (pydocstyle поддерживает разные правила).
- Мигрируйте по модулям: новые изменения — в новом формате, старые — постепенно.
- Настройте CI, чтобы новый стиль соблюдался.
Security и приватность
Не включайте в docstrings секреты, ключи доступа или конфиденциальные данные. Docstrings часто попадают в публичную документацию и в логи.
Важно: если пример требует реальных данных, используйте фиктивные или маскированные значения.
Decision flowchart — выбрать формат docstring
flowchart TD
A[Нужна простая документация?] -->|Да| B[Однострочный docstring]
A -->|Нет| C[Публичный API или библиотека]
C --> D{Нужна читабельность для научных пользователей?}
D -->|Да| E[NumPy формат]
D -->|Нет| F[Google формат]
E --> G[Настроить sphinxcontrib-napoleon]
F --> G
B --> H[Минимум: краткая строка и пример]
G --> I[Автоматизировать CI и линтинг]Короткое объявление для канала команды (100–200 слов)
Docstrings — это встроенная документация к функциям, классам и модулям Python. Согласованный стиль docstring ускоряет разработку и облегчает генерацию пользовательской документации с помощью Sphinx. Рекомендуется использовать Google или NumPy формат для публичных API, включать примеры и базовые doctest, а также автоматизировать проверку через CI. Пропишите стиль в CONTRIBUTING.md и начните миграцию модулей по очереди.
Короткий итог
Docstrings делают код понятнее и безопаснее при совместной работе. Выберите формат, автоматизируйте проверку и не храните в документации конфиденциальную информацию. Начните с простых однострочных описаний и расширяйте их для публичных модулей.
Похожие материалы
Как передать медиа с Windows на Chromecast
Instagram в браузере: использование на компьютере
Как добавить Gmail на iPhone
SEQUENCE в Excel: создание последовательностей
Bluetooth‑наушники на Nintendo Switch — подключение