Как внести вклад в документацию NumPy
Это руководство поможет вам определить, что внести, и как отправить свой вклад в официальную документацию NumPy.
Встречи команды документации
Сообщество NumPy поставило перед собой твердую цель улучшить документацию. Мы проводим регулярные встречи по документации в Zoom (даты объявляются на списке рассылки numpy-discussion), и все желающие могут принять в них участие. Свяжитесь с нами, если у вас есть вопросы или вам нужна помощь в ваших первых шагах – мы с удовольствием поможем. Протоколы записываются на hackmd.io и хранятся в репозитории NumPy Archive.
Что нужно
Подробная информация содержится в документации NumPy. Документация справочника API генерируется непосредственно из строк документации в коде во время создания документации. Хотя у нас в основном есть полная справочная документация для каждой функции и класса, доступных пользователю, для некоторых из них не хватает примеров использования.
Нам не хватает документов с более широким охватом – учебников, руководств и объяснений. Отправка отчетов об ошибках также является способом внесения вклада. Мы обсуждаем оба аспекта.
Внесение исправлений
Мы с нетерпением ждем отчетов об ошибках в документации и их исправлений. Но, чтобы справиться с самыми сложными проблемами, нам приходится откладывать или игнорировать некоторые отчеты об ошибках. Вот лучшие ошибки, на которые стоит обратить внимание.
В первую очередь стоит обратить внимание на технические неточности – пропущенный параметр в строке документации, неточное описание функции/параметра/метода и так далее. Также в приоритете другие «структурные» ошибки, такие как неработающие ссылки. Все эти исправления легко проверить и внедрить. Вы можете отправить запрос на вытягивание (PR) с исправлением, если знаете как это сделать; в противном случае, пожалуйста, откройте вопрос.
Опечатки и орфографические ошибки стоят ниже; мы приветствуем сообщения об них, но не всегда можем исправить их оперативно. Эти ошибки тоже могут быть обработаны в виде запросов на вытягивание или вопросов.
Очевидные ошибки формулировок (например, пропущенное «не») относятся к категории опечаток, но другие переформулировки – даже грамматические – требуют взвешенного решения, что повышает планку. Протестируйте возможность решения, сначала представив исправление как вопрос.
У некоторых функций/объектов, таких как numpy.ndarray.transpose, numpy.array и др., определенных в модулях расширений C, строки документации определены отдельно в _add_newdocs.py
Внесение новых страниц
Ваши трудности при работе с нашими документами – лучшее руководство о том, что необходимо исправить.
Если вы напишете отсутствующий документ, вы присоединитесь к фронту открытого исходного кода, но это значительный вклад, просто чтобы сообщить нам, чего не хватает. Если вы хотите составить документ, обсудите свои мысли на списке рассылки для получения дополнительных идей и отзывов. Если вы хотите сообщить нам о пробеле, откройте вопрос. См. этот вопрос для примера.
Если вы ищете темы, наша официальная дорожная карта документации — Предложение по улучшению NumPy (NEP), NEP 44 — Реструктуризация документации NumPy. Он определяет области, в которых нашим документам нужна помощь, и перечисляет несколько дополнений, которые мы хотели бы видеть, включая записные книжки Jupyter.
Структура документации
Существуют формулы для написания полезных документов, и четыре формулы охватывают практически все. Существует четыре формулы, потому что существует четыре категории документов – tutorial, how-to guide, explanation, и reference. Понимание того, что документы делятся таким образом, принадлежит Даньеле Проциде и его фреймворку Diátaxis. Когда вы начинаете документ или предлагаете его, имейте в виду, к какому типу он относится.
Учебники NumPy
В дополнение к документации, которая является частью исходного дерева NumPy, вы можете отправлять контент в формате Jupyter Notebook на страницу Учебники NumPy. Этот набор учебных материалов и учебных пособий призван предоставить высококачественные ресурсы от проекта NumPy, как для самостоятельного обучения, так и для преподавания курсов. Эти ресурсы разрабатываются в отдельном репозитории GitHub, numpy-tutorials, где вы можете ознакомиться с существующими блокнотами, открыть вопросы, чтобы предложить новые темы, или отправить свои учебные материалы в виде запросов на вытягивание.
Больше о внесении вклада
Не беспокойтесь, если английский не ваш родной язык или если у вас есть только черновой вариант. Открытый исходный код – это совместная работа сообщества. Постарайтесь сделать все возможное – мы поможем исправить проблемы.
Изображения и реальные данные делают текст более интересным и эффективным, но убедитесь, что используемые вами изображения имеют соответствующие лицензии и доступны. Опять же, даже эскиз рисунка могут быть доработаны другими.
На данный момент форматы данных, принимаемые NumPy, — это те же форматы, которые используются другими Python-библиотеками для научных вычислений, такими как pandas, SciPy или Matplotlib. Мы разрабатываем пакет для поддержки большего количества форматов; обратитесь к нам за подробностями.
Документация NumPy хранится в исходном дереве кода. Чтобы включить ваш документ в базу данных документации, необходимо загрузить дерево, собрать его и отправить запрос на вытягивание. Если GitHub и запросы на вытягивание вам незнакомы, ознакомьтесь с нашим Руководством по внесению вклада.
Наш язык разметки — reStructuredText (rST), который более сложен, чем Markdown. Sphinx, инструмент, который многие Python-проекты используют для создания и связывания документации проекта, преобразует rST в HTML и другие форматы. Дополнительные сведения о rST можно найти в кратком руководстве по reStructuredText или в руководстве по reStructuredText
Внесение вклада косвенно
Если вы найдете внешний материал, который может быть полезным дополнением к документации NumPy, сообщите нам об этом, отправив вопрос.
Вам не нужно вносить вклад непосредственно в документацию, чтобы внести вклад в NumPy. Вы внесли свой вклад, если написали учебник на своем блоге, создали видео на YouTube или ответили на вопросы на Stack Overflow и других сайтах.
Стиль документации
Документация для пользователя
- В общем случае, мы следуем руководству по стилю документации разработчиков Google для руководства пользователя.
-
Стиль NumPy регулирует случаи, когда:
- У Google нет руководства, или
- Мы предпочитаем не использовать стиль Google
Наши текущие правила:
- Мы склоняем index к indices, а не к indexes, следуя прецеденту
numpy.indices. - Для согласованности мы также склоняем matrix к matrices.
- Грамматические вопросы, недостаточно подробно рассмотренные в правилах NumPy или Google, решаются на основе раздела «Грамматика и использование» в последнем издании Справочника по стилю Чикагского университета.
- Мы приветствуем уведомления о случаях, которые необходимо добавить в правила стиля NumPy.
Строки документации
При использовании Sphinx в сочетании с конвенциями NumPy, вы должны использовать numpydoc расширение, чтобы ваши строки документации обрабатывались правильно. Например, Sphinx извлечет Parameters раздел из вашей строки документации и преобразует его в список полей. Использование numpydoc также позволит избежать ошибок reStructuredText, создаваемых обычным Sphinx, когда он сталкивается с соглашениями NumPy для строк документации, такими как заголовки разделов (например, -------------), которых Sphinx не ожидает найти в строках документации.
Его можно получить от:
Обратите внимание, что для документации внутри NumPy не обязательно выполнять import numpy as np в начале примера.
Пожалуйста, используйте numpydoc стандарт форматирования, как показано в их примере.
Документирование кода C/C++
NumPy использует Doxygen для анализа специально отформатированных блоков комментариев C/C++. Это создаёт XML-файлы, которые преобразуются с помощью Breathe в RST, используемый Sphinx.
Процесс документирования состоит из трёх этапов:
1. Написание блоков комментариев
Хотя пока ещё не установлен единый стиль комментирования, Javadoc предпочтительнее других из-за сходства с существующими неиндексированными блоками комментариев.
Примечание
Пожалуйста, см. “Документирование кода”.
Вот как выглядит стиль Javadoc:
/** * This a simple brief. * * And the details goes here. * Multi lines are welcome. * * @param num leave a comment for parameter num. * @param str leave a comment for the second parameter. * @return leave a comment for the returned value. */ int doxy_javadoc_example(int num, const char *str);
А вот как это отображается:
Предупреждение
doxygenfunction: Unable to resolve function “doxy_javadoc_example” with arguments None in doxygen xml output for project “numpy” from directory: ../build/doxygen/xml. Potential matches:
- int doxy_javadoc_example(int num, const char *str) - int doxy_javadoc_example(int num, const char *str) - int doxy_javadoc_example(int num, const char *str)
Для комментариев в строке можно использовать тройной слеш. Например:
/**
* Template to represent limbo numbers.
*
* Specializations for integer types that are part of nowhere.
* It doesn't support with any real types.
*
* @param Tp Type of the integer. Required to be an integer type.
* @param N Number of elements.
*/
template<typename Tp, std::size_t N>
class DoxyLimbo {
public:
/// Default constructor. Initialize nothing.
DoxyLimbo();
/// Set Default behavior for copy the limbo.
DoxyLimbo(const DoxyLimbo<Tp, N> &l);
/// Returns the raw data for the limbo.
const Tp *data();
protected:
Tp p_data[N]; ///< Example for inline comment.
};
А вот как это отображается:
- template<typenameTp,std::size_tN>
classDoxyLimbo
-
Шаблон для представления чисел в состоянии limbo.
Специализации для целочисленных типов, которые являются частью ниоткуда. Он не поддерживает никакие реальные типы.
- Param Tp:
-
Тип целого числа. Должен быть целочисленным типом.
- Param N:
-
Количество элементов.
Открытые функции
- DoxyLimbo()
-
Конструктор по умолчанию. Ничего не инициализирует.
- constTp*data()
-
Возвращает необработанные данные для limbo.
- DoxyLimbo()
-
Конструктор по умолчанию. Ничего не инициализирует.
- constTp*data()
-
Возвращает необработанные данные для limbo.
- DoxyLimbo()
-
Конструктор по умолчанию. Ничего не инициализирует.
- constTp*data()
-
Возвращает необработанные данные для limbo.
Пример
Посмотрите на следующий пример:
/**
* A comment block contains reST markup.
* @rst
* .. note::
*
* Thanks to Breathe_, we were able to bring it to Doxygen_
*
* Some code example::
*
* int example(int x) {
* return x * 2;
* }
* @endrst
*/
void doxy_reST_example(void);
А вот как это отображается:
Предупреждение
doxygenfunction: Unable to resolve function “doxy_reST_example” with arguments None in doxygen xml output for project “numpy” from directory: ../build/doxygen/xml. Potential matches:
- void doxy_reST_example(void) - void doxy_reST_example(void) - void doxy_reST_example(void)
2. Подготовка данных для Doxygen
Не все заголовочные файлы собираются автоматически. Вам необходимо добавить требуемые пути к заголовочным файлам C/C++ в файлы конфигурации Doxygen.
Файлы подконфигурации имеют уникальное имя .doxyfile, которое обычно можно найти рядом с каталогами, содержащими документированные заголовочные файлы. Вам нужно создать новый файл конфигурации, если он отсутствует в папке на уровне (2-уровневой) папки с заголовочными файлами, которые вы хотите добавить.
Файлы подконфигурации могут принимать любые из настроек Doxygen, но не должны перезаписывать или повторно инициализировать какие-либо опции конфигурации, а использовать только оператор конкатенации «+=». Например:
# to specify certain headers
INPUT += @CUR_DIR/header1.h \
@CUR_DIR/header2.h
# to add all headers in certain path
INPUT += @CUR_DIR/to/headers
# to define certain macros
PREDEFINED += C_MACRO(X)=X
# to enable certain branches
PREDEFINED += NPY_HAVE_FEATURE \
NPY_HAVE_FEATURE2
Примечание
@CUR_DIR — это константа-шаблон, возвращающая путь к текущей папке файла подконфигурации.
3. Директивы включения
Breathe предоставляет широкий спектр пользовательских директив для преобразования документов, созданных Doxygen, в файлы reST.
Примечание
Дополнительную информацию можно найти в разделе «Директивы и переменные конфигурации»
Общие директивы:
doxygenfunction
Эта директива генерирует соответствующий вывод для одной функции. Имя функции должно быть уникальным в проекте.
.. doxygenfunction:: <function name>
:outline:
:no-link:
Пример использования можно посмотреть здесь.
doxygenclass
Эта директива генерирует соответствующий вывод для одного класса. Она принимает стандартные параметры проекта, пути, схемы и опции без ссылок, а также дополнительные опции members, protected-members, private-members, undoc-members, membergroups и members-only:
.. doxygenclass:: <class name> :members: [...] :protected-members: :private-members: :undoc-members: :membergroups: ... :members-only: :outline: :no-link:
Более подробную информацию и пример использования можно найти в документации по классам Doxygen.
doxygennamespace
Эта директива генерирует соответствующий вывод для содержимого пространства имен. Она принимает стандартные параметры проекта, пути, схемы и опции без ссылок, а также дополнительные опции content-only, members, protected-members, private-members и undoc-members. Для ссылки на вложенное пространство имен необходимо указать полный путь, например, foo::bar для пространства имен bar внутри пространства имен foo.
.. doxygennamespace:: <namespace> :content-only: :outline: :members: :protected-members: :private-members: :undoc-members: :no-link:
Более подробную информацию и пример использования можно найти в документации по пространствам имен Doxygen.
doxygengroup
Эта директива генерирует соответствующий вывод для содержимого группы Doxygen. Группа Doxygen может быть объявлена с помощью специальной разметки Doxygen в комментариях к исходному коду, как описано в документации Doxygen по группам. Она принимает стандартные параметры проекта, пути, схемы и опции без ссылок, а также дополнительные опции content-only, members, protected-members, private-members и undoc-members.
.. doxygengroup:: <group name> :content-only: :outline: :members: :protected-members: :private-members: :undoc-members: :no-link: :inner:
Более подробную информацию и пример использования можно найти в документации по группам Doxygen.
Директива устаревшего кода
Если функция, модуль или API находится в режиме legacy (устаревший), то есть сохраняется для обратной совместимости, но не рекомендуется к использованию в новом коде, вы можете использовать директиву .. legacy::.
По умолчанию, если используется без аргументов, директива legacy сгенерирует следующий вывод:
Устаревший
Этот подмодуль считается устаревшим и больше не будет получать обновлений. Это также может означать его удаление в будущих версиях NumPy.
Мы настоятельно рекомендуем также добавить пользовательское сообщение, например, ссылку на новый API, заменяющий старый:
.. legacy:: For more details, see :ref:`distutils-status-migration`.
Это сообщение будет добавлено к стандартному сообщению и создаст следующий вывод:
Устаревший
Этот подмодуль считается устаревшим и больше не будет получать обновлений. Это также может означать его удаление в будущих версиях NumPy. Для получения дополнительной информации см. Статус numpy.distutils и рекомендации по миграции.
Наконец, если вы хотите упомянуть функцию, метод (или любой другой пользовательский объект) вместо подмодуля, вы можете использовать необязательный аргумент:
.. legacy:: function
Это создаст следующий вывод:
Устаревший
Эта функция считается устаревшей и больше не будет получать обновлений. Это также может означать её удаление в будущих версиях NumPy.
Чтение документации
- Ведущий организатор технических авторов Write the Docs проводит конференции, предоставляет обучающие ресурсы и управляет каналом Slack.
- «Каждый инженер — также писатель», — говорит Google в своей коллекции ресурсов по технической документации, которая включает бесплатные онлайн-курсы для разработчиков по планированию и написанию документов.
- Software Carpentry стремится обучать исследователей программному обеспечению. Помимо предоставления учебного плана, сайт объясняет, как эффективно представлять идеи.
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/dev/howto-docs.html