docopt は、docopt-ng として生き続けている、という話
Pythonでコマンドラインパーサと言ったら何を思い浮かべるだろう。
標準ライブラリ argparse の他、clickやfire などいろいろ選択肢があるが、私は docopt をずっと気に入って使っている。
で、docoptの(元祖)サイトを見に行くと、更新が止まっていてどうしたものか…と思ってしまうが、心配無用。
結論としては、docopt
は、docopt-ng
に引き継がれて
メンテナンスが続いているよ、という話。
日本語で言及している人が少なそうなので、記事にしておく。
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で)生きていける。
実装後に改めてコメントを書く労力なしに、 ファイル冒頭説明に使い方が書かれていると、 ソースコードの格好がついて整っている感じで、 非常に気持ちが良い。
複雑なオプション解析が必要な場合とか、 高度なことをするには不足かもしれないが、 手軽に使う分には、最良の選択肢の一つだと思っている。