はじめに
聞いて聞いて! nikkieです。
ドキュメント変換ツールSphinx
のautodoc
拡張を使うと、Pythonファイルからドキュメント(HTMLやPDFなどなど)を作れます。
HTMLでドキュメントを作るときに、このautodoc
拡張と、私が先日リリースしたライブラリsphinx-new-tab-link
が一緒に使えるのか検証しました。
11/27のSphinx+翻訳 Hack-a-thon 2022.11で取り組みました。
目次
- はじめに
- 目次
- 結論:autodocとsphinx-new-tab-linkは一緒に使えます!
- そもそもautodocとは?
- sphinx.ext.autodoc素振り
- Future works(素振りを通して存在を知った拡張たち)
- 終わりに
- P.S. docstringのスタイルについて
結論:autodoc
とsphinx-new-tab-link
は一緒に使えます!
百聞は一見に如かず、sphinx-new-tab-link
のAPIドキュメントを実際にご覧ください。
sphinx-new-tab-link
では、実装の参考にしたStackOverflowの回答をdocstringに書いています1。
class NewTabLinkHTMLTranslator(HTMLTranslator): """... ref: https://stackoverflow.com/a/67153583 """
autodoc拡張によって、このdocstringを元に作られたドキュメントが上記ページです。
APIドキュメントでは、StackOverflowのリンクがブラウザの新しいタブで開きます!🙌
autodoc
とsphinx-new-tab-link
を一緒に使う設定例
conf.py2
import os import sys sys.path.insert(0, os.path.abspath("相対パスで指定")) extensions = [ "sphinx.ext.autodoc", "sphinx_new_tab_link", ]
sphinx-new-tab-link
のAPIドキュメントの裏側(ドッグフーディング!)
上記のAPIドキュメントの元はapi.rst
です。
API === .. automodule:: sphinx_new_tab_link :members:
sphinx_new_tab_link
モジュール中のdocstringを持つメンバーからドキュメントを作るよう指定しています。
そもそもautodoc
とは?
Sphinxがインクルードしている拡張の一つ(sphinx.ext.autodoc
)です。
この拡張については、2020年6月のみんなのPython勉強会(a.k.a stapy)「Python製ドキュメント生成ツールSphinx丸わかり」で、tk0miyaさんのトークで聞いたとおぼろげながら覚えていました。
sphinx-new-tab-link
を公開してから、reSTのURLの記法には様々な種類があることに気付いて、サポートできていることを確認しています3。
確認した後、ふと「docstringから作ったドキュメントに含まれるURLも、ひょっとしてサポートできているんじゃないかな」と思ったのです。
そして、過去のstapyのSphinx回の資料をたどり、autodoc
を素振りしてから、一緒に使えることを確認しました。
sphinx.ext.autodoc
素振り
「Sphinx で Python プログラムのドキュメントを書こう」(みんなのPython勉強会 #58)
今日の発表資料です #stapy / Sphinx で Python プログラムのドキュメントを書こう - Google スライド https://t.co/AizjWbsIQT
— tk0miya (@tk0miya) 2020年6月10日
(55:00過ぎからです)
発表の例を写経
まずSphinxプロジェクトを用意します。
まっさらな環境でsphinx-quickstart
をしてもいいと思います。
私は横着をしてsphinx-new-tab-link
のドキュメント環境(docs
ディレクトリ以下)を使いました。
関係するファイルに絞って表したディレクトリツリーはこんな感じです。
. ├── conf.py # sphinx-quickstartで作成済み。**編集する** ├── example.py # 新規作成 ├── index.rst # sphinx-quickstartで作成済み。**編集する** ├── Makefile # sphinx-quickstartで作成済み └── make.bat # sphinx-quickstartで作成済み
ドキュメントにするPythonファイルexample.py
を用意します。
class Math: """数値計算用のクラスです。""" def add(self, x: int, y: int) -> int: """指定した2つの数値を加算します。 :param x: 数値1 :param y: 数値2 """ return x + y class SuperMath: #: 円周率 PI = 3.14 def mul(self, x, y): return x * y
conf.py
は2箇所設定を加えます。
import os import sys sys.path.insert(0, os.path.abspath(".")) # conf.py と同じディレクトリにある example.py をロードできるようにする extensions = [ "sphinx.ext.autodoc", ]
autodoc
拡張が提供するディレクティブをindex.rst
の中に書きました。
.. automodule:: example :members: :undoc-members:
example.py
全体からドキュメントを作っています。
docstringがないメンバーであってもドキュメントに含める指定です。
以上で完了!
make html
すると、example.py
のドキュメントができあがります!
Future works(素振りを通して存在を知った拡張たち)
stapyの発表資料にもありましたが、sphinx.ext.intersphinx
は気になりますね。
型ヒントのint
をPython公式ドキュメントへのリンクにしていました。
また、sphinx.ext.viewcode
とsphinx.ext.linkcode
も気になります。
ライブラリのドキュメントで見たことがあるのですが、sourceへ飛べるドキュメントの秘密は前者なのかな?
今回はautodoc
自体が初めてだったのでtoo muchにならないようにセーブしましたが、このあたりも触ってみたいところです。
終わりに
sphinx.ext.autodoc
を初めて触りました。
いや〜、docstringを元にしたドキュメントが作れるのはとても便利ですね4。
そして、自作ライブラリsphinx-new-tab-link
と合わせて使えることも確認しました!
もしかしてautodoc
使っているドキュメントは簡単にsphinx-new-tab-link
の恩恵にもあずかれる、ッテコト…?
「sphinx-new-tab-link
、ライブラリのドキュメントで広く使っていただけそう」と可能性しか感じません!(普及したらsphinx.ext
シリーズの中に入りうるのでは…❣️ ←親バカ)
「この記事でsphinx-new-tab-link
を知ったよ」という方、ぜひぜひ試していただき、ちょっとしたことでもかまいませんので、(伸びしろだけでなくぜひぜひよい点も)フィードバックをお寄せください!
私、アスタリスクが好きなんですが、スター🌟をいただいても嬉しいです!
P.S. docstringのスタイルについて
素振りを通して存在を知った拡張はもう1つあります。
その名はnapoleon
。
docstringのスタイルは3つあります。
- reStructuredText (reST)
- NumPy
autodoc
はreSTスタイルを前提にしていましたが、reSTスタイルでなくてもnapoleon
を使えばautodoc
でドキュメントに出力できるようです。
今回sphinx-new-tab-link
のAPIドキュメントを作るにあたってはreSTスタイルを採用しました。
理由は(新しいものがtoo muchにならないようにするのに加えて)PyCon JP 2019の「チームメイトのためにdocstringを書こう」でreSTスタイル + 型ヒントが紹介され(スライド23)、私にはこれがしっくり来ていたためです。
- https://github.com/ftnext/sphinx-new-tab-link/blob/v0.1.1/sphinx_new_tab_link/__init__.py#L4-L8↩
- https://github.com/ftnext/sphinx-new-tab-link/blob/f2ae70d92c2d9ad390381da4c8677687ec634ec3/docs/conf.py↩
- reStructuredTextとリンクを作るマークアップ(全部一緒だと思っていたのですが、細かい意味の違いがあった…だと…) - nikkie-ftnextの日記↩
-
コラボレータを始めた
SpeechRecognition
はdocstringとドキュメント用reSTファイルで二重管理になっている(一部はreSTが古くなってしまっている)ので、autodoc
さん、助けてください!🙏↩