$ sudo teach IT
МОДУЛЬ 10 · УРОК 4

Инструменты: help(), pydoc, Sphinx

Вы уже умеете писать docstring и type hints. Но кто их читает? Оказывается — не только люди! Python, IDE и специальные инструменты умеют превращать ваши docstring в красивую документацию. В этом уроке вы узнаете, какие инструменты для этого существуют и как ими пользоваться.

⏱ ~35 минут 🎓 Для новичков 🐍 Python 3

🗺️ Карта инструментов

Представьте: вы написали класс с хорошими docstring. Теперь у вас есть три уровня, на которых эта документация «оживает»:

🔍
help()
Прямо в Python REPL — мгновенно просмотреть документацию любого объекта
📄
pydoc
Из терминала — генерирует текстовую или HTML-документацию для модуля
📚
Sphinx
Профессиональный инструмент — создаёт сайт с документацией, как у Django или NumPy

Это не три разных подхода — это три уровня одного и того же. Начнём с самого простого.

🔍 help() — документация прямо в Python

REPL (Read-Eval-Print Loop) — это интерактивная оболочка Python. Вы запускаете python в терминале и попадаете туда: пишете код — Python сразу выполняет и показывает результат.

В REPL есть встроенная функция help(). Передайте ей любой объект — класс, функцию, модуль — и Python покажет всю документацию, которую вы написали в docstring.

Допустим, у нас есть такой класс:

class BankAccount:
    """Банковский счёт клиента.

    Хранит баланс и позволяет выполнять базовые операции:
    пополнение и снятие средств.

    Args:
        owner (str): Имя владельца счёта.
        balance (float): Начальный баланс. По умолчанию 0.
    """

    def __init__(self, owner: str, balance: float = 0) -> None:
        self.owner = owner
        self.balance = balance

    def deposit(self, amount: float) -> None:
        """Пополнить счёт на указанную сумму.

        Args:
            amount (float): Сумма пополнения. Должна быть положительной.
        """
        if amount <= 0:
            raise ValueError("Сумма должна быть положительной")
        self.balance += amount

    def withdraw(self, amount: float) -> float:
        """Снять деньги со счёта.

        Args:
            amount (float): Сумма снятия.

        Returns:
            float: Фактически снятая сумма.

        Raises:
            ValueError: Если сумма превышает баланс.
        """
        if amount > self.balance:
            raise ValueError("Недостаточно средств")
        self.balance -= amount
        return amount

Теперь запускаем Python, импортируем класс и вызываем help():

>>> from bank import BankAccount
>>> help(BankAccount)

Python выведет в терминал:

Help on class BankAccount in module bank:

class BankAccount(builtins.object)
 |  BankAccount(owner: str, balance: float = 0) -> None
 |
 |  Банковский счёт клиента.
 |
 |  Хранит баланс и позволяет выполнять базовые операции:
 |  пополнение и снятие средств.
 |
 |  Args:
 |      owner (str): Имя владельца счёта.
 |      balance (float): Начальный баланс. По умолчанию 0.
 |
 |  Methods defined here:
 |
 |  __init__(self, owner: str, balance: float = 0) -> None
 |      Initialize self.  See help(type(self)) for accurate signature.
 |
 |  deposit(self, amount: float) -> None
 |      Пополнить счёт на указанную сумму.
 |
 |      Args:
 |          amount (float): Сумма пополнения. Должна быть положительной.
 |
 |  withdraw(self, amount: float) -> float
 |      Снять деньги со счёта.
 |
 |      Args:
 |          amount (float): Сумма снятия.
 |
 |      Returns:
 |          float: Фактически снятая сумма.
 |
 |      Raises:
 |          ValueError: Если сумма превышает баланс.
💡 Важно: help() работает с любым объектом Python — даже со встроенными. Попробуйте в REPL: help(list), help(str.split), help(len). Вся стандартная библиотека Python задокументирована именно так.

help() можно вызвать и для конкретного метода:

>>> help(BankAccount.withdraw)

Help on function withdraw in module bank:

withdraw(self, amount: float) -> float
    Снять деньги со счёта.

    Args:
        amount (float): Сумма снятия.

    Returns:
        float: Фактически снятая сумма.

    Raises:
        ValueError: Если сумма превышает баланс.

📄 pydoc — документация из терминала

pydoc — это встроенный модуль Python, который работает прямо из командной строки. Он делает то же самое, что help(), но не требует запускать Python — достаточно написать команду в терминале.

Допустим, у нас есть файл bank.py с нашим классом. Открываем терминал в той же папке:

ТЕРМИНАЛ

Просмотреть документацию текстом:

python -m pydoc bank

Выведет в терминал ту же информацию, что и help() — все классы и функции модуля.

Сгенерировать HTML-файл:

python -m pydoc -w bank

Создаст файл bank.html в текущей папке. Открыв его в браузере, вы увидите аккуратную страницу с документацией — со стилями, навигацией и ссылками между разделами.

python -m pydoc bank
Текст в терминале. Удобно для быстрой проверки.
python -m pydoc -w bank
Создаёт bank.html. Можно открыть в браузере и поделиться.
python -m pydoc -p 8080
Запускает локальный сервер. Открой браузер на localhost:8080.
🤔 Когда использовать pydoc? Это удобный инструмент для небольших проектов и личного использования. Если вам нужно быстро поделиться документацией с коллегой или сохранить её в виде файла — pydoc справится. Для серьёзных проектов используют Sphinx (о нём ниже).

📚 Sphinx — профессиональная документация

Вы когда-нибудь читали документацию Django, Flask, NumPy или SQLAlchemy? Все эти сайты с красивыми боковыми панелями, поиском, версиями и примерами кода — они сделаны с помощью Sphinx.

Sphinx — это инструмент, который берёт ваши docstring и генерирует полноценный сайт с документацией. Он поддерживает темы оформления, поиск, кросс-ссылки и множество форматов вывода (HTML, PDF, epub).

📝 Обзорный урок: Sphinx — большая тема. Здесь мы разберём только основы — установку и структуру проекта. Цель: понять, что Sphinx существует, как он работает, и уметь начать его использовать. Углублённое изучение — тема отдельного курса.

🔧 Установка

Sphinx устанавливается через pip — стандартный менеджер пакетов Python:

pip install sphinx

Если вы планируете использовать стиль Google или NumPy для docstring (мы изучили их в предыдущих уроках), установите расширение napoleon:

pip install sphinx sphinx-autodoc-typehints

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

Перейдите в папку с вашим проектом и запустите мастер настройки:

sphinx-quickstart docs

Sphinx задаст несколько вопросов: название проекта, имя автора, версия. После ответов создастся папка docs/ со структурой:

docs/
├── conf.py          ← главный файл конфигурации
├── index.rst        ← главная страница документации
├── make.bat         ← для Windows: команды сборки
└── Makefile         ← для Linux/macOS: команды сборки

conf.py — самый важный файл. В нём указываются расширения Sphinx, тема оформления и настройки. Именно здесь вы подключаете autodoc и napoleon.

🧩 Ключевые расширения

sphinx.ext.autodoc
Автоматически извлекает docstring из вашего кода и вставляет в документацию. Не нужно копировать текст вручную.
sphinx.ext.napoleon
Понимает стиль Google и NumPy. Без него Sphinx не распознаёт Args:, Returns: и форматирует их как обычный текст.
sphinx.ext.viewcode
Добавляет ссылку «[source]» рядом с каждой функцией — клик открывает исходный код прямо в документации.

Подключаются расширения в conf.py:

# docs/conf.py

extensions = [
    'sphinx.ext.autodoc',    # читает docstring из кода
    'sphinx.ext.napoleon',   # поддержка Google/NumPy стиля
    'sphinx.ext.viewcode',   # ссылки на исходный код
]

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

После настройки достаточно одной команды:

# Linux / macOS
make -C docs html

# Windows
docs\make.bat html

Sphinx создаст папку docs/_build/html/ с готовым сайтом. Откройте index.html в браузере — и вы увидите профессиональную документацию вашего проекта.

🧠 IDE становится умнее: подсказки из docstring

Документация нужна не только людям. PyCharm, VS Code и другие современные редакторы умеют читать ваши docstring и type hints — и использовать эту информацию, чтобы помогать вам писать код быстрее и с меньшим количеством ошибок.

Представьте: вы создаёте объект вашего класса и начинаете вызывать метод:

account = BankAccount("Иван", 1000)
account.deposit(  # ← нажали открывающую скобку

IDE мгновенно показывает всплывающую подсказку (popup) прямо в редакторе:

ПОДСКАЗКА IDE (popup)
deposit(amount: float) → None
Пополнить счёт на указанную сумму.
Args:
amount (float): Сумма пополнения. Должна быть положительной.

Это не магия — IDE просто читает ваш docstring и type hints. Чем лучше документация, тем умнее IDE.

💬
Описание функции
Первая строка docstring появляется во всплывающей подсказке при наведении на имя функции.
🔴
Подсветка ошибок типов
IDE видит type hints и предупреждает, если вы передаёте строку вместо числа — ещё до запуска.
⚡
Автодополнение
IDE знает тип возвращаемого значения → предлагает методы этого типа сразу после вызова.

Посмотрите на разницу между двумя версиями одного и того же метода с точки зрения IDE:

# ❌ Версия без документации — IDE ничего не знает
def calculate(x, y):
    return x * y + x

# ✅ Версия с документацией — IDE знает всё!
def calculate(x: float, y: float) -> float:
    """Вычислить результат по формуле x * y + x.

    Args:
        x (float): Первый множитель (основание).
        y (float): Второй множитель (коэффициент).

    Returns:
        float: Результат вычисления.
    """
    return x * y + x
🎯 Ключевой инсайт: Когда вы пишете docstring и type hints, вы одновременно делаете четыре вещи: помогаете себе в будущем, помогаете коллегам, делаете IDE умнее и автоматически создаёте документацию. Одна инвестиция — четыре выгоды.

💼 Практический рабочий процесс

Как выглядит использование этих инструментов в реальной работе? Вот типичный сценарий:

1
Пишете код с docstring и type hints
Это просто хорошая привычка. Стоит минуту — экономит часы.
2
Проверяете через help() или pydoc
help(MyClass) в REPL позволяет быстро убедиться, что документация выглядит нормально.
3
Если проект растёт — подключаете Sphinx
Когда модулей становится много — Sphinx автоматически соберёт всю документацию в один сайт.
🚀 Совет новичку: Не пытайтесь сразу освоить Sphinx. Начните с малого: пишите docstring к каждому классу и функции, добавляйте type hints. Когда у вас будет первый проект с несколькими файлами — попробуйте python -m pydoc -w имя_модуля и удивитесь результату. Sphinx придёт сам, когда будет нужен.

📌 Итоги урока

🔍
help(obj) — встроенная функция Python. Вызовите её в REPL для любого объекта, чтобы мгновенно увидеть документацию из docstring.
📄
pydoc — встроенный инструмент командной строки. python -m pydoc module — текст в терминале, -w — HTML-файл.
📚
Sphinx — профессиональный генератор документации. Устанавливается через pip, запускается через sphinx-quickstart. Используется в Django, Flask, NumPy.
🧩
autodoc + napoleon — расширения Sphinx. autodoc читает docstring из кода, napoleon понимает стили Google и NumPy.
🧠
IDE-подсказки — PyCharm и VS Code читают docstring и type hints, показывают подсказки, подсвечивают ошибки типов и улучшают автодополнение.
💡
Главный вывод: Хорошо документированный код — это не просто текст для людей. Это инструкция для IDE, входной материал для pydoc и Sphinx, и ваша страховка от ошибок.