kntty.hateblo.jp

ここに何か書く。

docopt は、docopt-ng として生き続けている、という話

Pythonコマンドラインパーサと言ったら何を思い浮かべるだろう。

標準ライブラリ argparse の他、clickやfire などいろいろ選択肢があるが、私は docopt をずっと気に入って使っている。

で、docoptの(元祖)サイトを見に行くと、更新が止まっていてどうしたものか…と思ってしまうが、心配無用。

結論としては、docoptは、docopt-ng に引き継がれて メンテナンスが続いているよ、という話。

github.com

日本語で言及している人が少なそうなので、記事にしておく。

docoptの概要

ごく簡単に、docoptを紹介しておく。

docoptは、「規則に従って書いたヘルプメッセージから、 コマンドラインパーサを作る」という、通常とは逆転の発想を 持ったライブラリである。

具体的な書き方の例を示す。pythonスクリプトの冒頭のコメントに、Usageと、オプションの説明を書けば良い。

   ### 'Usage:'から空行まで、Usageパターンを認識 ###
   """
   Usage:
       my_program.py <file> [options]

   ### 空白除いて '-' から始まる行は、オプションとして認識 ###
   # 空白1個区切りで短いオプションと長いオプション。
   # 空白2個以上の後に、説明を記載。
   # [default: ]によってデフォルト値指定。
   Options:
       -p --port=<n>  何らかの番号
       -o <dir>       出力ディレクトリの指定 [default: ./output]
       --quiet        静かに実行
   """
   from docopt import docopt 

   args = docopt(__doc__)
   # print(args)

このように書いておけば、あとは、args["<file>"]として文字列を拾ったり、 args["--quiet"]としてboolを拾ったりすることができる。

インストールは、pipで。pip install docopt-ngとする。

その他、詳細はいろいろあるので、GitHubページを参照のこと。

なお、docopt自体はこれ以上の機能を持たないシンプルな設計なので、 型変換や範囲チェックなどのバリデーションは、(必要ならschemaなどを用いて)別途行う。

docoptからdocopt-ngに至る経緯

私の記憶と断片的な情報をもとに書いているので、全く以って正確でないとは思うが、記しておく。

オリジナルのdocoptは、PyCon UK 2012で出現して、注目を浴びた。 その発想から、他の様々な言語にも移植された。

そんなdocoptだが、(少なくとも)元の Python実装は、GitHub2018年でメンテが止まっていて久しい。

一方、それより前か後か、docoptからForkされた改良版の1つ、 docopt-ng が存在しており、それが jazzband という、Python系プロジェクトの維持を目的とした (メタ) プロジェクトのメンテナンス下に収まったようである。

ちなみに、メンテナンス版(docopt-ng)の方が docopt の名前を踏襲できないか、という issue に挙がったりしているけれど、先例 (PIL→pillowとか) に見られるように、名前を変えるのはそう簡単ではない模様。

というわけで

ともあれ、docoptの民は、今後も、(docopt-ngで)生きていける。

実装後に改めてコメントを書く労力なしに、 ファイル冒頭説明に使い方が書かれていると、 ソースコードの格好がついて整っている感じで、 非常に気持ちが良い。

複雑なオプション解析が必要な場合とか、 高度なことをするには不足かもしれないが、 手軽に使う分には、最良の選択肢の一つだと思っている。