1135 votes

Quel est le format standard de la docstring Python ?

J'ai vu quelques styles différents d'écriture de docstrings en Python, y a-t-il un style officiel ou "convenu" ?

6 votes

python.org/dev/peps/pep-0008 il y a une section entière consacrée aux chaînes de documentation

39 votes

Je pense que cette question n'était pas assez claire parce que PEP-257 et PEP-8 établissent seulement la base pour les docstrings, mais que diriez-vous de epydoc , doxygen , sphinx ? Est-ce que quelqu'un a des statistiques, est-ce que l'un d'entre eux va remplacer les autres, dans des cas comme celui-ci, trop d'options peuvent nuire.

1 votes

@sorin, j'aimerais également savoir quel balisage, le cas échéant, est le plus courant. Mais je pense que la réponse est qu'aucun d'entre eux n'est vraiment très courant : les gens ont tendance à préférer regarder la source Python directement, plutôt que de la convertir en html. Ainsi, il est plus utile d'être cohérent, mais d'une manière qui est optimisée pour la lisibilité humaine, et sans balisage explicite.

1390voto

daouzli Points 830

Formats

Les docstrings Python peuvent être écrites suivant plusieurs formats comme les autres posts l'ont montré. Cependant, le format par défaut de la docstring de Sphinx n'a pas été mentionné et est basé sur reStructuredText (reST) . Vous pouvez trouver des informations sur les principaux formats dans ce tuto .

Notez que le reST est recommandé par le PEP 287

Voici les principaux formats utilisés pour les docstrings.

- Epytext

Historiquement, un javadoc était prédominant, il a donc été pris comme base pour la création de Epydoc (avec l'appelé Epytext ) pour générer de la documentation.

Exemple :

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

- ReST

Aujourd'hui, le format probablement le plus répandu est le reStructuredText (reST) qui est utilisé par Sphinx pour générer de la documentation.

Exemple :

"""
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 a son propre format qui est assez utilisé. Il peut également être interprété par Sphinx.

Exemple :

"""
This is a groups style docs.

Parameters:
    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

Notez que Numpy recommande de suivre ses propres numpydoc basé sur le format Google et utilisable par 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
"""

Convertir/Générer

Il est possible d'utiliser un outil comme Pyment pour générer automatiquement les docstrings d'un projet Python non encore documenté, ou pour convertir des docstrings existants (pouvant mélanger plusieurs formats) d'un format à un autre.

Remarque : Les exemples sont tirés du Documentation sur le paiement

25 votes

J'ajouterais que reST est ce qui est utilisé par défaut dans JetBrains PyCharm, il suffit de taper les guillemets après avoir défini votre méthode et d'appuyer sur entrée. jetbrains.com/pycharm/help/creating-documentation-comments.html

28 votes

La réponse la plus complète, qui comprend un aperçu de l'histoire et des meilleures pratiques actuelles. Maintenant, tout ce dont nous avons besoin, c'est d'un mouvement de la communauté vers un nouveau "meilleur" format et d'un effort supplémentaire de la communauté pour créer des outils de migration de tous les autres vers le nouveau format, afin que nous puissions réellement faire évoluer les meilleures pratiques.

3 votes

Yo @daouzli, le lien google style est 404. Je crois celui-ci est correcte. Vous pouvez ajouter exemple de style google sphinx également. Excellente réponse, d'ailleurs. EDIT : J'ai modifié votre réponse moi-même.

354voto

Nathan Points 1836

Le site Guide de style Google contient un excellent guide de style Python. Il comprend conventions pour une syntaxe lisible de la docstring qui offre de meilleures orientations que le PEP-257. Par exemple :

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

J'aime étendre cela pour inclure également des informations sur le type dans les arguments, comme décrit dans cet article. Tutoriel de documentation Sphinx . Par exemple :

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

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

49 votes

Je trouve le style "signature dans les docstrings" terriblement redondant et verbeux. Pour Python 3+, Annotations de fonctions sont un moyen beaucoup plus propre de le faire. C'est encore pire s'il utilise des pseudo-types strings : Python est bien meilleur avec le typage des canards.

29 votes

Oui, mais au moins cela donne une idée du type de canard attendu, et la majorité des développeurs ne sont pas encore sur Python 3

4 votes

@Evpok personnellement, je n'aime pas les annotations de fonctions. Pour utiliser des classes dans celles-ci, vous risquez de devoir faire des importations inutiles, pour utiliser des chaînes de caractères dans celles-ci, vous risquez de manquer d'espace horizontal très rapidement en les décrivant. Jusqu'à présent, je n'ai pas vu l'intérêt de les utiliser pour quoi que ce soit.

244voto

Tim McNamara Points 6478

Les conventions de la docstring sont dans PEP-257 avec beaucoup plus de détails que PEP-8.

Cependant, les docstrings semblent être beaucoup plus personnels que les autres domaines du code. Différents projets auront leur propre norme.

J'ai tendance à toujours inclure les docstrings, car ils ont tendance à démontrer comment utiliser la fonction et ce qu'elle fait très rapidement.

Je préfère garder les choses cohérentes, quelle que soit la longueur de la corde. J'aime l'aspect du code lorsque l'indentation et l'espacement sont cohérents. Cela signifie que j'utilise :

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

Terminé :

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

Et j'ai tendance à ne pas commenter la première ligne dans les longues docstrings :

def sq(n):
    """
    Returns 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

Ce qui veut dire que je trouve que les docstrings qui commencent comme ça sont désordonnés.

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

100 votes

Notez que PEP-8 indique spécifiquement que les docstrings doivent être écrits comme des commandes/instructions, plutôt que des descriptions, par exemple. """Return the squared result""" plutôt que """Returns the squared result""" . Bien que personnellement, j'écris les miens comme ceux de Tim ici, malgré ce que dit le PEP.

69 votes

Je ne suis pas non plus d'accord avec ce conseil (utilisation de l'impératif) parce qu'il commence à être maladroit pour tout ce qui dépasse une phrase. De plus, vous êtes décrivant une fonction, sans dire au lecteur ce qu'il doit faire.

14 votes

Note : La spécification pour les docstrings prescriptifs plutôt que descriptifs apparaît en fait dans le document PEP-257 et non PEP-8. Je viens d'une tradition de Java, où je décrivais des fonctions, mais j'ai finalement commencé à utiliser l'impératif lorsque mon paradigme de programmation est passé de l'orientation objet à la procédure. Et quand j'ai commencé à utiliser pycco pour générer une documentation de type programmation littéraire, il est devenu très évident pourquoi le temps impératif a été suggéré. Vous devez choisir en fonction de votre paradigme.

67voto

joris Points 10700

Comme apparemment personne ne l'a mentionné : vous pouvez également utiliser la fonction Numpy Docstring Standard . Il est largement utilisé dans la communauté scientifique.

L'extension Napolean sphinx pour analyser les docstrings de style Google (recommandée dans la réponse de @Nathan) supporte également les docstrings de style Numpy, et fait une courte comparaison des deux.

Et enfin un exemple de base pour donner une idée de ce à quoi cela ressemble :

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

3 votes

Le format NumPy, à mon avis, prend trop d'espace vertical, qui est rare sur les écrans larges (sauf si vous en utilisez un tourné de 90 degrés, mais je suppose que la plupart des gens ne le font pas). Donc, à mon avis, le format Google est un bon choix en ce qui concerne la lisibilité et les fonctionnalités.

6 votes

Je suppose que c'est quelque peu subjectif. Une fois que vous avez une docstring plus complexe (avec différentes sections, avec des exemples, etc, ce qui prend beaucoup d'espace vertical de toute façon, quel que soit le format), je trouve le format numpydoc plus facile à lire / mieux structuré.

2 votes

Personnellement, je pense qu'une docstring aussi longue est mieux située dans la documentation, pas dans le code source, si elle est si longue, elle finit par gêner la lisibilité du module.

14voto

bstpierre Points 12616

PEP-8 est la norme de codage officielle de Python. Elle contient une section sur les docstrings, qui fait référence à PEP-257 -- une spécification complète pour les docstrings.

12 votes

Mentionner PEP-257 dans le contexte de "comment dois-je documenter correctement les paramètres, les valeurs de retour, les exceptions soulevées, etc." est une plaisanterie - il n'en dit pas un seul mot (bien qu'un exemple de code en montre quelques-uns). À mon avis, le format Google est un bon choix en termes de lisibilité et de fonctionnalités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X