Il a été décidé d'étendre la fonctionnalité d'un programme Python développé dans un projet tout en le maintenant dans un autre nouveau projet. En prenant le relais, j'ai décidé de conserver le document HTML généré par Sphinx en tant que document interne. Dans le passé, j'avais de l'expérience dans la conversion en HTML avec Doxygen, et j'intégrais la même quantité d'informations que les commentaires dans le code source, donc je devrais prendre en charge Sphinx. L'arrière-plan.
Le document de conception détaillée est généré automatiquement.
Comme c'est la première fois que vous utilisez Sphinx, enregistrez le contenu du travail. De plus, la règle d'origine est adoptée pour le domaine de docstring.
Comme suit.
Il existe un format Google et un format numpy, mais reStructureText (communément appelé reST) a été adopté. La raison en est la suivante.
C'est une procédure pour l'environnement Windows, mais il semble que macOS et Linux ne soient pas si différents.
pip install Sphinx sphinx-autodoc-typehints
pip install sphinx_rtd_theme
Utilisez sphinx_rtd_theme
pour le thème des documents HTML.
C'est un peu difficile à voir par défaut.
Supposons la structure de fichiers suivante.
.
├── src/ #Le code source complet est ci-dessous
│ ├── __init__.py
│ ├── Foo.py
│ ├── Bar.py
│ └── Hoge/
│ ├── __init__.py
│ └── Hoge.py
│
└── doc/ #Ceci est le répertoire de travail de Sphinx
src /
doc / ''Exécutez la commande suivante à partir du terminal.
sphinx-apidoc -F -a -o .\doc .\src
cd doc
make html
.\_build\html\index.html
make html
Générez un document html avec. Si vous modifiez la docstring dans le code source, il vous suffit de réexécuter cette commande.
La commande finale index.html lance le navigateur par défaut et ouvre le document HTML.
Sphinx semble transmettre le code Python cible au système de traitement, et s'il y a une erreur dans le code cible, une erreur se produira avec `` make html '' et aucun document ne sera généré. Vérifiez le fonctionnement à l'avance.
Par conséquent, par exemple, si le code cible utilise un package qui est unique à Windows, il ne peut pas être documenté dans un environnement macOS ou Linux à moins qu'un package factice ne soit créé par vous-même.
Si vous conservez la valeur par défaut, ce n'est pas bon, alors ajoutez la ligne suivante au fichier de configuration
doc / conf.py```.
doc/conf.py
html_theme = 'sphinx_rtd_theme' #Spécifier le thème d'affichage
autodoc_typehints = 'description' #Activer les conseils de type
autoclass_content = 'both' # __init__()Sortie également
autodoc_default_options = {'private-members': True, #Méthode privée de sortie
'show-inheritance': True} #Afficher l'héritage
Voici ce que nous faisons ci-dessus.
_
, telles que _method1 () ʻou
__method2 ()`Après avoir modifié les paramètres, exécutez
make html```.
Je me suis référé à cette page pour les paramètres. Importer la documentation de sphinx.ext.autodoc --docstring
Au fait, je l'ai utilisé avec language = en
. La mise en page n'était pas correcte avec ja
.
La notation reST de la docstring adoptée est affichée.
Une description du package est donnée ici.
__init__.py
"""Titre du package
|Des informations détaillées sont écrites ici.
|Assurez-vous d'ouvrir une ligne à partir du titre du package.
|← Si vous utilisez un bloc de ligne, l'état de saut de ligne est conservé.
:author:Nom de la personne en charge de ce programme
:copyright:Affichage des droits d'auteur
"""
Les chaînes entre deux points, telles que
: author: et
: copyright: `` ci-dessus, sont appelées des champs et peuvent être définies indépendamment. Lorsque le HTML est sorti, il s'affiche comme suit.
L'en-tête du fichier est le même que celui du package.
Foo.py
"""Titre du module
|Des informations détaillées sont écrites ici.
|Assurez-vous d'ouvrir une ligne à partir du titre du module.
:note:S'il y a des notes, décrivez-les ici.
:author:Nom de la personne en charge de ce programme
:copyright:Affichage des droits d'auteur
"""
Ce qui précède montre un exemple d'ajout du champ : note:
.
Utilisez le champ : note:
chaque fois que nécessaire comme note dans toutes les docstrings.
La description de l'en-tête de classe s'affiche.
class Foo(object):
"""Résumé de la classe
|Description détaillée de la classe.
|Assurez-vous d'ouvrir une ligne du résumé de la classe.
|← Les blocs de ligne peuvent également être utilisés.
"""
La description de l'en-tête de la méthode s'affiche.
class Foo(object):
def method(self, name: str, val: int) -> str:
'''Résumé de la méthode
|Description détaillée de la classe.
|Assurez-vous d'ouvrir une ligne du résumé de la classe.
|← Les blocs de ligne peuvent également être utilisés.
:param name:Nom ← Voir l'indice de type si le nom de type est omis
:param int val:Valeur ← Vous pouvez écrire directement le nom du type
:returns:(Explication de la valeur de retour)
:rtype str:← Peut être omis s'il y a un type de retour et un indice de type
'''
...
Pour écrire des indices de type, définissez `` -> None '' pour les méthodes qui n'ont pas de valeur de retour.
2020/8/1: Supplément Quand j'ai regardé le code source de SudachiPy, j'ai trouvé que les indices de type utilisaient uniquement des méthodes publiques. Si la maintenance est difficile, existe-t-il une telle division?
La description des membres de la classe d'énumération est décrite comme suit.
class State(enum.Enum):
"""Etat
"""
UNINIT = enum.auto() #:Non initialisé
READY = enum.auto() #:Attendre
BUSY = enum.auto() #:En traitement
Si la ligne de description devient longue, vous pouvez continuer avec
\ '' ou
`` ''.
"""Résumé du module
Description du module. ¥
Cette ligne est affichée à partir de la ligne supérieure sans interruption.
"""
Lorsque j'ai introduit des indices de type à des fins de documentation, je me suis retrouvé coincé avec des indices de type.
Si vous utilisez votre classe comme indice de type tel quel, une erreur se produira.
class Foo(object):
def method(self, obj: Foo) -> None:
#↑ Foo devient indéfini
pass
Vous pouvez éviter l'erreur en utilisant une chaîne de caractères comme indiqué ci-dessous.
class Foo(object):
def method(self, obj: 'Foo') -> None:
# ↑ OK!
pass
Il a également été écrit correctement sur PEP-484.
Si
list ou `` dict
est spécifié comme type d'argument ou de valeur de retour, le type de l'élément ne peut pas être décrit. Par conséquent, il est décrit à l'aide de Liste '' et
Dict '' du package de saisie.
from typing import List
from typing import Dict
import Bar.Bar
class Foo(object):
def method(self, bars: List[Bar],
map: Dict[str, int]) -> List[str]:
...
Les spécifications de Foo.method () sont les suivantes.
bars``` est une liste d'objets de la classe BarCliquez ici pour plus de détails. PEP-484: Type Aliases
Lors de l'importation entre les modules, une erreur se produit lors de l'importation circulaire car elle est dans un état d'importation mutuelle et un message d'erreur tel que ʻImportError: Cannot import name ... `s'affiche. Dans un tel cas, la position est essentiellement «Veuillez changer la structure», mais si la structure ne peut pas être modifiée par tous les moyens, le compromis suivant a été fait.
(1) Abandonnez l'indice de type et écrivez le nom du type dans la docstring (2) Faites du nom du type une chaîne de caractères comme les références directes
Plus tard, dans la correspondance de (2), il a été constaté que la vérification de «F821 nom indéfini» a été interceptée lors du passage à travers flake8, et en fait, toute la correspondance a été effectuée en (1).
Special Thanks
Recommended Posts