KotlinでPythonのargparseみたいなのを作ってみた

コマンドライン引数パーサーはいろんな言語に実装されています。自分が初めてまともに触った引数パーサーがPythonに標準でついてくるargparseでした。
argparseは標準ライブラリの一つではありますが、かなり実用的な引数パーサーとして使用できます。helpやusageも表示してくれて超便利です。(Pythonは標準ライブラリonly縛りでもある程度戦えるからすごい!)

自分はこれまでこのargparseがよく使う言語にあると良いなーと考え、とりあえずC++に実装しました。
今回はその第二弾(?)と言うことでKotlinに実装しました。

リポジトリはGitHubにあります。
ライセンスはApache License 2.0です。

使い方

 使い方はできるだけオリジナルのargparseに合わせました。
import net.sileader.argparse.ArgumentParser
import kotlin.system.exitProcess

fun main(cmd: Array<string>) {
    val parser = ArgumentParser("program", epilogue = "test program")

    parser.addArgument("-v", "--version", action = "store_true", help = "show version")

    val sub = parser.addSubParser()
    val push = sub.addParser("push", "push")
    push.addArgument("-d", "--data", action = "store", help = "data")

    val pull = sub.addParser("pull", "pull")
    pull.addArgument("-b", "--byte", action = "store", help = "data")

    val args = parser.parseArgs(cmd)

    if(args.has("version")) {
        println("version")
        exitProcess(0)
    }

    println("include = ${args.get("I")}")
    println("input = ${args.get("input")}")
}

関数名はJava的な命名になっているので完全に同じではありませんが、割とそれっぽく使えると思います。

機能

機能としては、フラグ、キーワード引数、位置引数をサポートします。現在はactionで指定できるのはstoreとstore_trueだけです。別の操作をする場合はカスタマイゼーションポイントの項を参照してください。
またヘルプの自動生成、サブコマンドに対応しています。
使い方は概ね本家と同じになっています。

C++と比較して

C++との一番大きな違いは引数でした。
C++には名前付き引数がないので引数の順序を工夫しても、突然trueが出てきて何がtrueなんだ...みたいな気分になってしまいます。
ですが、Kotlinは名前付き引数をサポートするので
required = true
みたいに記述でき、非常に可読性が向上します。(C++にも言語機能で名前付き引数欲しい。難しいだろうけど)

あと言語は関係ないですが、同じようなプログラムを書くのが、言語は違えど2回目なので、前よりは割とちゃんとしたものが作れたと思います。

カスタマイゼーションポイント

今回のargparseはカスタマイズできる所として、addArgumentメソッドのactionがあります。
デフォルトではstore_trueとstoreしか提供されませんが、net.sileader.argparse.Actionを継承したクラスのインスタンスを渡すことで自分の好きな動作を行わせることができます。

まとめ

  • KotlinでPythonのargparseっぽいもの作ったよ!
  • 名前付き引数素晴らしいよ!
  • addArgumentのaction引数は自分で好きなようにカスタムできるよ!
  • 是非使ってもらえると嬉しいよ!

コメント

このブログの人気の投稿

初めの挨拶

C++11の機能 (型推論, 範囲for)

C++11の機能 (関数のdefault・delete宣言, overrideとfinal指定子, 移譲コンストラクタ, 継承コンストラクタ)