Co to jest standardowy format Python docstring? [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 3 lata temu .

Popraw to pytanie

Widziałem kilka różnych stylów pisania docstrings w Pythonie, czy istnieje oficjalny lub" uzgodniony " styl?

Author: n611x007, 2010-10-10

7 answers

Formaty

Docstringi Pythona mogą być pisane w kilku formatach, jak pokazały inne posty. Jednak domyślny format docstring Sphinx nie został wymieniony i jest oparty na reStructuredText (reST) . Informacje o głównych formatach można znaleźć w w tym wpisie na blogu .

Zauważ, że reszta jest zalecana przez PEP 287

Poniżej znajdują się główne używane formaty docstrings.

- Epytext

Historycznie a javadocpodobnie jak styl był rozpowszechniony, więc został wzięty jako podstawa dla Epydoc (z formatem Epytext) do generowania dokumentacji.

Przykład:

"""
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
"""

- reszta

Obecnie prawdopodobnie bardziej rozpowszechnionym formatem jest format reStructuredText (reST), który jest używany przez Sphinx do generowania dokumentacji. Uwaga: jest on używany domyślnie w JetBrains PyCharm(wpisz potrójne cudzysłowy po zdefiniowaniu metody i naciśnij enter). Jest również używany przez domyślnie jako format wyjściowy w Pyment.

Przykład:

"""
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 ma swój własny format , który jest często używany. Może być również interpretowany przez Sfinksa(tj. korzystanie z wtyczki ).

Przykład:

"""
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.
"""

Nawet więcej przykładów

- Numpydoc

Zauważ, że Numpy zalecają podążanie za własnym numpydoc opartym na formacie Google i używanym przez Sfinks.

"""
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
"""

Konwersja / Generowanie

Możliwe jest użycie narzędzia takiego jak Pyment do automatycznego generowania docstringów do projektu Pythona, który nie jest jeszcze udokumentowany, lub do konwersji istniejących docstringów (może być mieszanie kilku formatów) z formatu na inny.

Uwaga: przykłady pochodzą z dokumentacji Pyment

 1148
Author: daouzli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-13 03:30:53

The Google style guide zawiera doskonały przewodnik po stylach Pythona. Zawiera konwencje dla czytelnej składni docstring , która oferuje lepsze wskazówki niż PEP-257. Na przykład:

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

Chciałbym rozszerzyć to również o informacje typu w argumentach, jak opisano w tym Sphinx documentation tutorial . Na przykład:

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

       Args:
           value (str): the value to add.
    """
    pass
 336
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-28 17:48:08

Konwencje Docstring są wPEP-257 o wiele bardziej szczegółowe niż PEP-8.

Jednak docstringi wydają się być znacznie bardziej osobiste niż inne obszary kodu. Różne projekty będą miały swój własny standard.

Zazwyczaj zawsze dołączam docstringi, ponieważ mają one tendencję do pokazywania, jak korzystać z funkcji i co robi bardzo szybko.

Wolę zachować spójność, niezależnie od długości łańcucha. Lubię jak kodować wygląda gdy wcięcia i odstępy są spójne. Czyli używam:

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

Over:

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

I mają tendencję do pomijania komentowania pierwszej linijki w dłuższych docstringach:

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
To znaczy, że docstringi, które zaczynają się w ten sposób, są niechlujne.
def sq(n):
    """Return the squared result. 
    ...
 237
Author: Tim McNamara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 16:25:05

Jak nikt o tym nie wspomniał: możesz również użyć numpy Docstring Standard. Jest szeroko stosowany w środowisku naukowym.

Napolean sphinx rozszerzenie do parse Google-style docstrings (zalecane w odpowiedzi na @Nathan) obsługuje również docstring w stylu Numpy i dokonuje krótkiego porównania obu.

I ostatni podstawowy przykład, aby dać pomysł, jak to wygląda:

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
 61
Author: joris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-08 04:07:19

PEP-8 jest oficjalnym standardem kodowania Pythona. Zawiera sekcję dotyczącą docstringów, która odnosi się do PEP-257 -- kompletnej specyfikacji docstringów.

 13
Author: bstpierre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-10 01:48:11

It ' s Python; anything goes . Zastanów się, jak opublikować swoją dokumentację . Docstringi są niewidoczne z wyjątkiem czytników Twojego kodu źródłowego.

Ludzie naprawdę lubią przeglądać i przeszukiwać dokumentację w Internecie. Aby to osiągnąć, użyj narzędzia dokumentacji Sphinx . To de facto standard dokumentowania projektów Pythona. Produkt jest piękny-zobacz https://python-guide.readthedocs.org/en/latest /. Strona przeczytaj Docs będzie hostować Twoje dokumenty za darmo.

 11
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 10:13:16

Proponuję użyć programu Vladimira Kelesheva pep257 Python, aby sprawdzić Twoje docstringi pod kątem PEP-257 i standardu Numpy Docstring do opisywania parametrów, zwrotów itp.

Pep257 zgłosi rozbieżność od standardu i nazywa się tak jak pylint i pep8.

 8
Author: Finn Årup Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 15:34:24