Який стандартний формат docstring Python? [зачинено]


887

Я бачив декілька різних стилів написання доктрингів у Python, чи існує офіційний чи «узгоджений» стиль?


6
python.org/dev/peps/pep-0008 є цілий розділ, присвячений рядкам документації
механічний_міс

30
Я думаю , що це питання було недостатньо ясний , так як PEP-257 і PEP-8 є створення тільки бази для рядків документації, але як щодо epydoc, doxygen, sphinx? Хтось має статистику, чи хтось із них замінить інші, у таких випадках, як занадто багато варіантів, це може зашкодити.
sorin

1
@sorin, я також хотів би знати, яка розмітка, якщо така є, є найбільш поширеною. Але я думаю, що відповідь полягає в тому, що жоден з них насправді не є таким загальним: люди, як правило, вважають за краще дивитися на джерело Python безпосередньо, а не перетворюватися на html. Отже, найкорисніше бути просто послідовними, але оптимізованими для людської читабельності, а не явної розмітки.
poolie

3
PyCharm автозавершує досить цікавий спосіб, що, на мій погляд, є гарною реалізацією інструкцій, необхідних для його виконання:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Маттео Ферла

1
Яка з цих відповідей відповідає тій, яка працює за замовчуванням з аналізатором документації VS Code?
Вільям Ентрікен

Відповіді:


1019

Формати

Документи Python можна записати у кількох форматах, як показали інші повідомлення. Однак формат docstring Sphinx за замовчуванням не згадувався і базується на reStructuredText (reST) . Ви можете отримати інформацію про основні формати в цій публікації блогу .

Зауважте, що відпочинок рекомендований PEP 287

Далі випливають основні використовувані формати для docstrings.

- Епітекст

Історично Javadoc як стиль переважав, так що було прийнято в якості основи для Epydoc (з викликуваним Epytextформаті) для створення документації.

Приклад:

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""

- відпочинок

На сьогодні, мабуть, найбільш поширеним форматом є формат reStructuredText (reST), який використовується Sphinx для створення документації. Примітка: вона використовується за замовчуванням у JetBrains PyCharm (введіть потрійні лапки після визначення методу та натисніть клавішу Enter). Він також використовується за замовчуванням як вихідний формат у Pyment.

Приклад:

"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

- Google

У Google є власний формат, який часто використовується. Він також може бути інтерпретований Сфінксом (тобто, використовуючи плагін Наполеона ).

Приклад:

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""

Ще більше прикладів

- Numpydoc

Зауважте, що Numpy рекомендують дотримуватися власного numpydoc, заснованого на форматі Google і використовуваному Sphinx.

"""
My numpydoc description of a kind
of very exhautive numpydoc format docstring.

Parameters
----------
first : array_like
    the 1st param name `first`
second :
    the 2nd param
third : {'value', 'other'}, optional
    the 3rd param, by default 'value'

Returns
-------
string
    a value in a string

Raises
------
KeyError
    when a key error
OtherError
    when an other error
"""

Перетворення / генерування

Можна використовувати такий інструмент, як Pyment, для автоматичного генерування документації до ще не задокументованого проекту Python, або для перетворення існуючих документів (може змішувати декілька форматів) з формату в інший.

Примітка. Приклади взяті з документації Pyment


10
Я можу додати, що reST - це те, що використовується за замовчуванням у JetBrains PyCharm. Просто введіть потрійні лапки після визначення методу та натисніть клавішу Enter. jetbrains.com/pycharm/help/creating-documentation-comments.html
Феліпе Альмейда

12
Найбільш вичерпна відповідь, включає відчуття історії та сучасні кращі практики. Тепер все, що нам потрібно, - це певне відчуття руху громади до нового "найкращого" формату та додаткові зусилля громади для створення інструментів міграції з усіх інших для нового, щоб ми могли насправді розвивати найкращу практику.
BobHy

2
yo @daouzli, посилання в стилі google - 404. Я вірю, що це правильно. Ви також можете додати приклад стилю google spinx . Чудова відповідь btw. РЕДАКТУВАННЯ: Я сама редагувала вашу відповідь.
voy

4
хороша відповідь. Смію сказати, де ви можете змінити формат docstring за замовчуванням у PyCharm (JetBrains): Налаштування -> Інструменти -> Інтегровані інструменти Python -> Формат Docstring. Удачі!
Джекссн

4
Я здивований, що ніхто не коментував перший рядок тексту: зараз це строго правильно, але я вважаю, що кращим способом є розміщення його на першому рядку відразу після потрійних лапок. PEP 8 та PEP 257 роблять це майже у всіх своїх прикладах. PEP 287 робить це так, але, на мій досвід, це не так часто.
Лапінот

323

Посібник зі стилів Google містить чудовий посібник зі стилів Python. Він включає умовні позначення для читаного синтаксису docstring, що пропонує кращі вказівки, ніж PEP-257. Наприклад:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass

Мені подобається розширити це, щоб також включити інформацію про типи в аргументи, як описано в цьому посібнику з документації щодо Сфінкса . Наприклад:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass

37
Я вважаю, що "підпис у docstrings" -стиль надзвичайно зайвий і багатослівний. Для Python 3+, примітки щодо функцій - це набагато чистіший спосіб зробити це. Ще гірше, якщо він використовує псевдосильні типи: Python набагато кращий з набором качок.
Євпок

27
так, але принаймні це дає натяк на те, яку качку очікують, і більшість чортів ще не є на Python 3
Anentropic

3
@Evpok особисто мені не подобаються анотації до функцій. Для використання в них класів вам, можливо, доведеться робити непотрібний імпорт, а для використання рядків у них, можливо, ви не вистачаєте горизонтального простору, описуючи їх. Поки що я не бачив сенсу використовувати їх ні для чого.
OdraEncoded

5
@Nathan, посібник зі стилів Google рекомендує коментарі, які є описовими, а не декларативними, наприклад, "Витягує рядки з Bigtable" над "Вибір рядків з Bigtable". Таким чином, зміна "Обчислити ..." на "Обчислити ..." зробить ваш приклад більш узгодженим з рештою коментаря, тобто "Повернення" та "Підвищення".
gwg

2
nit: Слідуючи стилю Google, використовуйте описову, а не імперативну форму, тобто "Обчислює ..." та "Додає ..."
sbeliakov

228

Докстринг-конвенції містяться в PEP-257 з набагато більш детальною інформацією, ніж PEP-8.

Однак, здається, документування набагато більш особисте, ніж інші області коду. У різних проектів буде свій стандарт.

Я прагну завжди включати docstrings, оскільки вони, як правило, демонструють, як використовувати функцію та що вона робить дуже швидко.

Я вважаю за краще тримати речі послідовними, незалежно від довжини струни. Мені подобається, як виглядає кодування, коли відступи та пробіли є послідовними. Це означає, що я використовую:

def sq(n):
    """
    Return the square of n. 
    """
    return n * n

Понад:

def sq(n):
    """Returns the square of n."""
    return n * n

І схильні залишати коментарі до першого рядка в довших документах:

def sq(n):
    """
    Return the square of n, accepting all numeric types:

    >>> sq(10)
    100

    >>> sq(10.434)
    108.86835599999999

    Raises a TypeError when input is invalid:

    >>> sq(4*'435')
    Traceback (most recent call last):
      ...
    TypeError: can't multiply sequence by non-int of type 'str'

    """
    return n*n

Значить, я знаходжу доктрини, які починаються таким чином, безладним.

def sq(n):
    """Return the squared result. 
    ...

90
Зауважте, що PEP-8 спеціально говорить, що доктрини повинні бути записані як команди / інструкції, а не як описи, наприклад. """Return the squared result"""а не """Returns the squared result""". Хоча особисто я пишу, як Тим тут, незважаючи на те, що говорить PEP.
Cam Jackson

63
Я також не погоджуюся з цією порадою (використовуючи імперативне напруження), оскільки вона починає звучати незручно для чогось довшого, ніж одне речення. Крім того, ви описуєте функцію, не кажучи читачеві, що робити.
mk12

14
Примітка: Специфікація для рецептурних, а не описових документів, насправді міститься в PEP-257 , а не в PEP-8. Я походив з традиції Java, де я описував функції, але нарешті почав використовувати імперативну напругу, коли моя парадигма програмування перейшла з об'єктно-орієнтованої на процедурну. І коли я почав використовувати pycco для створення документації в стилі грамотного програмування, стало дуже очевидно, чому було запропоновано імперативне напруження. Ви повинні вибирати, виходячи зі своєї парадигми.
karan.dodia

25
Імперативом є граматичний настрій . (Вибачте.)
Денис Дрешер

5
@ Mk12 Повідомлення про виконання Git також слід писати як команди замість описів. І вони також " описують " зміну коду, "не говорячи читачеві, що робити". Тому я думаю, що це просто умова писати описи як команди.
onepiece

58

Як про це ніхто не згадував: ви також можете скористатися Numpy Docstring Standard . Він широко використовується в науковому співтоваристві.

Наполеївське розширення сфінкса для розбору документів у стилі Google (рекомендується у відповіді @Nathan) також підтримує докстринг у стилі Numpy і дає коротке порівняння обох.

І останній основний приклад, щоб дати уявлення про те, як це виглядає:

def func(arg1, arg2):
    """Summary line.

    Extended description of function.

    Parameters
    ----------
    arg1 : int
        Description of arg1
    arg2 : str
        Description of arg2

    Returns
    -------
    bool
        Description of return value

    See Also
    --------
    otherfunc : some related other function

    Examples
    --------
    These are written in doctest format, and should illustrate how to
    use the function.

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
    return True

2
Формат NumPy IMHO займає занадто багато вертикального простору, якого не вистачає на широкоекранних моніторах (за винятком випадків, коли ви використовуєте такий, який повернувся на 90 градусів, але, мабуть, більшість людей цього не робить). Отже, IMHO Google Format - хороший вибір щодо читабельності та особливостей.
Семаніно

3
Я думаю, це дещо суб'єктивно. Після того, як у вас є складніший docstring (з різними розділами, з прикладами тощо), тому займаючи багато вертикального простору незалежно від формату, я вважаю, що формат numpydoc легше читати / краще структурувати.
joris

2
Особисто я відчуваю, що такий довгий docstring краще розташовується в документації, а не у вихідному коді, якщо він буде таким довгим, що вони перешкоджають читанню модуля.
Джонатан Хартлі

12

PEP-8 є офіційним стандартом кодування python. Він містить розділ про docstrings, в якому йдеться про PEP-257 - повна специфікація для docstrings.


8
Згадування PEP-257 у контексті "як я повинен правильно документувати параметри, значення повернення, підняті винятки тощо" - ДЖОКЕ - це не говорить про них жодного слова (хоча приклад коду показує деякі). Формат Google IMHO - хороший вибір щодо читабельності та особливостей.
Семаніно

9

Це Python; все йде . Розглянемо, як опублікувати свою документацію . Документи невидимі, крім читачів вашого вихідного коду.

Люди дуже люблять переглядати та шукати документацію в Інтернеті. Для цього скористайтеся інструментом документації Sphinx . Це фактичний стандарт для документування проектів Python. Продукт прекрасний - подивіться на https://python-guide.readthedocs.org/en/latest/ . Веб-сайт « Прочитайте документи » розмістить ваші документи безкоштовно.


22
Я звичайно використовую ipythonдля тест-драйву бібліотеку, і це робить прочитання документальних записів мертвим простим - все, що мені потрібно набрати, your_module.some_method_im_curious_about?і я отримую кожен приємний роздруківку, включаючи docstring.
Танатос

8
Користувачі бібліотеки або API або пишуть плагін , швидше за все, дивляться на код і потребують розуміння цього. Я вважаю, що коментарі набагато важливіші в Python, ніж у Java або C #, оскільки типи не декларуються. Це дуже допомагає, якщо коментарі дають уявлення про те, які види качок передаються та повертаються. (Інакше вам доведеться реально пройти весь код і підрахувати, що даний параметр повинен бути ... ітерабельним тут ... підтримка індексування там ... підтримка числового віднімання в кінці ... Ага! Це в основному int array. Коментар допоміг би!)
Джон Кумбс

Е, ні. Документи не є невидимими, і це трохи суть. Ви можете побачити docstring, якщо ви запускаєте helpфункцію задокументованою функцією / методом / класом (і це ви можете зробити, навіть якщо у вас є лише доступ до складеного модуля). Особисто я думаю, що слід пам’ятати про це, вибираючи конвенцію про доктрини (тобто, що вона має намір читатись так, як є).
злетіння

7

Я пропоную використовувати Володимир Keleshev в pep257 програму Python , щоб перевірити рядки документації в відношенні PEP-257 і Numpy рядки документації стандарту для опису параметрів, повертається, і т.д.

pep257 повідомить про розбіжність, який ви робите від стандарту, і називається як pylint та pep8.


Згадування PEP-257 у контексті "як я повинен правильно документувати параметри, значення повернення, підняті винятки тощо" - ДЖОКЕ - це не говорить про них жодного слова (хоча приклад коду показує деякі). Формат NumPy IMHO займає занадто багато вертикального простору, якого не вистачає на широкоекранних моніторах (за винятком випадків, коли ви використовуєте такий, який повернувся на 90 градусів, але, мабуть, більшість людей цього не робить). Отже, IMHO Google Format - хороший вибір щодо читабельності та особливостей.
Семаніно

1
@ Semanino Я згадую стандарт Ncpy Docstring у контексті програми pep257, - не PEP-257. Ця програма тепер називається підоскстилем. pydocstyle дозволяє зробити кілька перевірок numpydoc, наприклад, pydocstyle --select=D4 tmp.pyперевірки на наявність ряду проблем із вмістом docstring, включаючи найменування розділів.
Фінн Еруп Нільсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.