2019-10-27に更新

CLIツールを簡単に作れるフレームワークを作ったよ!

PythonでCLIツールを簡単に作れるようになるフレームワークを作ってみました!

argparseって正直使いにくくないですか?
groomなら、実質関数を1つ定義するだけでコマンドラインツールを作成できます。

インストール

pypiに登録してあるので簡単!

$ pip install groom

これで終わりです。早速使ってみましょう!

簡単に使ってみる

さて、早速使ってみましょう。
2つの数を取って、四則演算するコマンドラインツールを作ってみます。

import sys
from groom import positional, optional, Dispatcher

__version__ = '1.0'

def calculate(
    num1: positional(float, "former number", required=True, var_name='N1'),
    num2: positional(float, "latter number", required=True, var_name='N2'),
    operator: optional(str, "operator name", short_name='op')='add'):
  if operator == 'add':
    print(num1 + num2)
    return
  if operator == 'sub':
    print(num1 - num2)
    return
  if operator == 'mul':
    print(num1 * num2)
    return
  if operator == 'div':
    print(num1 / num2)
    return
  print("unknown operator:", operator, file=sys.stderr)

if __name__ == '__main__':
  Dispatcher(
    calculate,
    "calculate one of four arithmetic operations"
  ).dispatch()

これだけで、ヘルプの表示やコマンドライン引数の処理までができます。
生成されたヘルプメッセージはこんな感じ。

calc.py: 1.0

calculate one of four arithmetic operations

Usage:
  calc.py [-v | --version | -h | --help]
  calc.py params...

positional parameters:
N1:
  former number
  type: float
  required: True
N1:
  latter number
  type: float
  required: True

parameters:
--operator, -op:
  operator name
  type: str
  required: False
  multiple values: False
  default: add

どうでしょうか? かなり簡単になっているのではないかと思います。
ヘルプメッセージの改善に関しては鋭意取り組み中ですので、少々お待ち頂けたらw


追記 2019/10/27

groom==0.0.3a1で、ヘルプメッセージを少し改善しました。現在はこのようになります。

calc.py: 1.0

calculate one of four arithmetic operations

Usage:
  calc.py [-v | --version | -h | --help]
  calc.py <N1> <N2>
    [--operator <OPERATOR> | -op <OPERATOR>]

positional parameters:
N1:
  former number
  type: float
  required: True
N2:
  latter number
  type: float
  required: True

parameters:
--operator, -op:
  operator name
  type: str
  required: False
  multiple values: False
  default: add

一応サブコマンドにも対応していまして、以下のようにすれば可能です。が、こちらも鋭意改善中です。

d = Dispatcher(func, "desc")
d.add_subcommand(
  "sub-command",
  Dispatcher(subfunc, "subdesc"))

このプロジェクトのGitHubのリポジトリはhttps://github.com/frodo821/groomです。issueやpull requestなど、どんどんお寄せいただけたら凄く嬉しいです。よろしくお願いします。

Originally published at www.tech-frodo.xyz
ツイッターでシェア
みんなに共有、忘れないようにメモ

frodo821

Pythonをこよなく愛するプログラマ。広く浅くアンテナを張っている(つもり)。 出来ることと言えばフロントエンド全般やJava、Kotlinを使ったアプリ開発、PHP/Pythonでバックエンドが少々にC#、Python、Java、Kotlin、Scalaなどを使ったデスクトップ開発くらいのもの。PyPIで自作ライブラリ公開したりもしている。https://pypi.org/project/rattlepy/ https://pypi.org/project/groom/ 好きなフロントエンドフレームワークはReact、バックエンドフレームワークはCodeIgniterとMasonite。自分のサイトもReactを使って構築した。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント