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используется, когда нужен программный доступ к отформатированному тексту без запуска внешних программ.
Типичные ошибки при использовании
Ошибка при передаче несуществующего имени модуля в виде строки:
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)}')Аналоги функции в других языках программирования
Концепция программного доступа к документации существует во многих языках, но реализация и возможности различаются.
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 предоставляет более интегрированное решение, извлекающее информацию непосредственно из объектов интерпретатора.