Pydoc.render doc: примеры (PYTHON)
pydoc.render_doc(obj: object, renderer: callable = ...): strОписание функции pydoc.render_doc
Функция pydoc.render_doc является частью стандартного модуля pydoc в Python. Она генерирует текстовую или HTML-документацию для любого объекта Python: модуля, класса, функции, метода или атрибута. Её применяют для программного получения справки в формате, аналогичном выводу встроенной функции help(), но с возможностью дальнейшей обработки или кастомизации.
Основное назначение - создание строкового представления документации, которое можно сохранить в файл, отправить по сети или вывести в пользовательский интерфейс.
Аргументы функции
- object (обязательный): Объект Python, для которого требуется сгенерировать документацию. Может быть модулем, классом, функцией, методом, свойством или любым другим объектом.
- renderer (опциональный, по умолчанию
pydoc.plaintext): Функция-рендерер, определяющая формат вывода. Основные варианты:pydoc.plaintext: Рендеринг в обычный текст (используется по умолчанию).pydoc.html: Рендеринг в HTML-разметку.pydoc.text: Альтернативный рендерер для текста.
- title (опциональный, по умолчанию
'Python Library Documentation: %s'): Заголовок документации. В строке можно использовать спецификатор%s, который будет заменён на имя объекта. - forceload (опциональный, по умолчанию
0илиFalse): Если установлен в1илиTrue, модуль будет принудительно перезагружен с помощьюimportlib.reload()перед генерацией документации. Полезно при работе с изменёнными модулями без перезапуска интерпретатора.
Возвращаемое значение
Функция возвращает строку (str), содержащую отформатированную документацию для переданного объекта в соответствии с выбранным рендерером. Если документация отсутствует, выводится информация о структуре объекта (например, список его методов и атрибутов).
Короткие примеры использования
Пример получения текстовой документации для встроенной функции len:
import pydoc
doc_text = pydoc.render_doc(len)
print(doc_text[:300])Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.Пример генерации HTML-документации для модуля math:
import pydoc
html_doc = pydoc.render_doc('math', renderer=pydoc.html)
print(html_doc[:400])<!DOCTYPE html>
<html>
<head>
<title>Python Library Documentation: math</title>
</head>
<body>
<h1>Help on module math:</h1>Пример с кастомным заголовком и принудительной загрузкой модуля:
import pydoc
import mymodule
doc = pydoc.render_doc(mymodule, title='Документация: %s', forceload=1)
print(doc.split('\n')[0])Документация: mymodule
Похожие функции в Python
- help(object): Встроенная функция, интерактивно выводящая документацию в консоль. Использует
pydocinternally.pydoc.render_docпредпочтительнее, когда требуется получить документацию в виде строки для программной обработки, а не для немедленного вывода. - object.__doc__: Строковый атрибут, содержащий raw docstring объекта.
pydoc.render_docпредоставляет более полную и отформатированную информацию, включая наследование, сигнатуры методов и список атрибутов. - inspect.getdoc(object): Функция из модуля
inspect, возвращающая очищенный docstring. Она менее ресурсоёмкая, но даёт только сырой текст документации без дополнительной структуры. - pydoc.doc(object): Открывает документацию в веб-браузере или текстовом pager.
pydoc.render_docиспользуется, когда нужен программный доступ к отформатированному тексту без запуска внешних программ.
Аналоги функции в других языках программирования
Концепция программного доступа к документации существует во многих языках, но реализация и возможности различаются.
JavaScript (JSDoc)
// Документация генерируется инструментами типа JSDoc из комментариев.
// Пример комментария:
/**
* Возвращает сумму двух чисел.
* @param {number} a Первое число.
* @param {number} b Второе число.
* @returns {number} Сумма a и b.
*/
function sum(a, b) {
return a + b;
}
// Для получения документации в runtime используются специализированные библиотеки.Java (Javadoc)
// Документация извлекается из исходного кода утилитой javadoc.
// Пример комментария:
/**
* Возвращает сумму двух чисел.
* @param a первое число
* @param b второе число
* @return сумма a и b
*/
public int sum(int a, int b) {
return a + b;
}
// В runtime доступ к документации ограничен, требуется использование reflection и анализ исходных файлов.PHP (phpDocumentor)
// Документация генерируется из DocBlock комментариев.
/**
* Возвращает сумму двух чисел.
*
* @param int $a Первое число.
* @param int $b Второе число.
*
* @return int Сумма $a и $b.
*/
function sum($a, $b) {
return $a + $b;
}
// Reflection API позволяет получить DocBlock в runtime.
$reflection = new ReflectionFunction('sum');
echo $reflection->getDocComment();Golang (godoc)
// Документация извлекается из комментариев и объявлений.
// Комментарий должен находиться непосредственно перед элементом.
// sum возвращает сумму двух целых чисел.
func sum(a int, b int) int {
return a + b
}
// godoc -http=:6060 запускает веб-сервер с документацией.
// Программный доступ через go/doc и go/ast пакеты.Отличия от Python
В отличие от Python, где pydoc.render_doc работает в runtime и не требует дополнительных инструментов, во многих языках документация генерируется на этапе сборки из комментариев. Python предоставляет более интегрированное решение, извлекающее информацию непосредственно из объектов интерпретатора.
Типичные ошибки при использовании
Ошибка при передаче несуществующего имени модуля в виде строки:
import pydoc
doc = pydoc.render_doc('non_existent_module')
print(doc)Traceback (most recent call last): File "<stdin>", line 1, in <module> ... ImportError: No module named 'non_existent_module'
Попытка использовать рендерер, который не является вызываемым объектом:
import pydoc
doc = pydoc.render_doc(len, renderer='html')Traceback (most recent call last): File "<stdin>", line 1, in <module> ... TypeError: 'str' object is not callable
Ошибка при указании неверного порядка аргументов (в старых версиях Python порядок renderer и forceload мог отличаться):
import pydoc
# В Python 3.7 renderer был после forceload
doc = pydoc.render_doc(len, pydoc.html, forceload=0)Traceback (most recent call last): File "<stdin>", line 1, in <module> ... TypeError: render_doc() takes at most 3 arguments (4 given)
Чтобы избежать этой проблемы, рекомендуется использовать именованные аргументы.
Изменения в последних версиях Python
В Python 3.10 были внесены изменения в модуль pydoc, улучшающие обработку аннотаций и производительность. Однако сигнатура pydoc.render_doc осталась стабильной.
В Python 3.11 оптимизирована работа с большими модулями, что может повлиять на скорость генерации документации.
Важное изменение произошло в Python 3.7: параметры renderer и forceload стали keyword-only в некоторых контекстах, что повысило ясность кода. Рекомендуется всегда использовать именованные аргументы для этих параметров.
Расширенные примеры использования
Пример сохранения HTML-документации модуля в файл:
import pydoc
html_content = pydoc.render_doc('csv', renderer=pydoc.html)
with open('csv_documentation.html', 'w', encoding='utf-8') as f:
f.write(html_content)
print('Документация сохранена в csv_documentation.html')Пример создания простой веб-системы документации для списка модулей:
import pydoc
modules = ['os', 'sys', 'json']
for module_name in modules:
doc = pydoc.render_doc(module_name, renderer=pydoc.html)
filename = f'{module_name}_doc.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(doc)
print(f'Создан файл {filename}')Пример использования кастомного рендерера для вывода документации в упрощённом текстовом формате:
import pydoc
def custom_render(doc, title):
# Упрощённый рендерер: только заголовок и первая строка docstring
lines = doc.split('\n')
simplified = f'Тема: {title}\nКратко: {lines[0] if lines else "Нет описания"}'
return simplified
# Получаем сырые данные документации
raw_doc = pydoc.render_doc(str, renderer=pydoc.plaintext)
# Применяем кастомный рендерер
custom_doc = custom_render(raw_doc, 'Класс str')
print(custom_doc)Тема: Класс str Кратко: Help on class str in module builtins:
Пример программного извлечения только сигнатур методов из документации класса:
import pydoc
import re
doc_text = pydoc.render_doc(dict)
# Ищем строки, содержащие сигнатуры методов (например, метод(...))
signatures = re.findall(r'^\s*\w+\([^)]*\)', doc_text, re.MULTILINE)
print('Некоторые методы dict:')
for sig in signatures[:5]:
print(f' {sig}')Некоторые методы dict: clear() copy() fromkeys(iterable[, value]) get(key[, default]) items()
Пример сравнения документации двух версий одного модуля с принудительной перезагрузкой:
import pydoc
import mymodule
# Первоначальная документация
doc1 = pydoc.render_doc(mymodule)
# Внесены изменения в модуль mymodule...
# Получаем обновлённую документацию с forceload
doc2 = pydoc.render_doc(mymodule, forceload=1)
# Сравниваем (примитивно по длине)
print(f'Длина документации до: {len(doc1)}')
print(f'Длина документации после: {len(doc2)}')