※このブログにはどちらかというと不快になる要素が含まれているかもしれません。閲覧の際には十分にご注意下さい。
概要
「使いやすく引数も自由自在なコマンドラインツールを作ってみたいんや〜」
ということでpythonでコマンドラインツールを作る時に必要な引数を認識するオプションパーサーを使ってちょっとしたツールを作ってみたいと思います。
オプションパーサー
pythonでコマンドラインオプション解析するためには以下の2つがあります。
- sys.argv
一番、手軽に使えて基本的かつ手軽なやり方ですが引数の順番が変わったりすると対応がめんどくさくなるためオプションパーサーとしての応用がさせにくいです。 - argparse
sys.argvに比べてadd_argumentを用いて必須項目を設定したり、変数の保存先を指定したり、真偽値を保存したり、変数の型を指定したりと様々なことが出来ます。
今回はargparseを使ってコマンドラインツールを作って行きたいと思います。
CUP
- 持つ手のある茶碗(ちゃわん)。 「コーヒー―」
- 賞杯。 「優勝―」
- ブラジャーの乳に当てる部分。
今回は3の意味のCUPを使いオプションパーサの実演をしたいです。ブラジャーが好きとかいやらしい気持ちがあるとか一切ありません。
実装
ArgumentParser(usage=usage)でパーサーを作成します。 parser.add_argumentでオプションに関するいろんな設定ができるようになっています。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from argparse import ArgumentParser def parser(): usage = 'Usage:python <FILE> [-b <bust size>] [-i] [-u <under>] [-t <top>] [--help]'\ .format(__file__) parser = ArgumentParser(usage=usage) parser.add_argument('-b','--bust',dest='bust_size',help='you want to know the bust size(A ~ H)infomation ') parser.add_argument('-i','--infomation',dest='bust_list',help='infomation' ) parser.add_argument('-u','--under',dest='under',type=int,help='bust infor' ) parser.add_argument('-t','--top',dest='top',type=int,help='bust infomation' ) args = parser.parse_args() if args.bust_size: return '{}'.format(cup(args.bust_size)) if args.bust_list: return '{}'.format(cup_info(args.bust_list)) if args.under and args.top: return '{}'.format(cup_cal(args.under,args.top)) def cup(size): if size.upper() == "AA": return ('{} cup is very like, Call me ***-****-****').format(size) elif size.upper() == 'A': return ('{} :Angel').format(size) elif size.upper() == 'B': return ('{} :Beautiful' ).format(size) elif size.upper() == 'C': return ('{} :Creative').format(size) elif size.upper() == 'D': return ('{} :Deluxe').format(size) elif size.upper() == 'E': return ('{} :Elegant').format(size) elif size.upper() == 'F': return ('{} :Fantastic').format(size) else: return ('{} :女性の敵').format(size) def cup_info(bust): cup = ['AA','A','B','C','D','E','F','G','H'] diff = [7.5,10.0,12.5,15.0,17.5,20.0,22,5,25.0,27,5] return ('The difference between the top and the under is {} cm').format(diff[cup.index(bust.upper())]) def cup_cal(under,top): cup = ['AA','A','B','C','D','E','F','G','H'] diff = [7.5,10.0,12.5,15.0,17.5,20.0,22,5,25.0,27,5] op_diff = top - under for n in diff: if op_diff > n: return ('{}{}').format(cup[(diff.index(n))],under) break else: pass return 'UNKNOW' if __name__ == '__main__': result = parser() print(result)
実演
-h
$python3 o.py -h usage: Usage:python <FILE> [-b <bust size>] [-i] [-u <under>] [-t <top>] [--help] optional arguments: -h, --help show this help message and exit -b BUST_SIZE, --bust BUST_SIZE you want to know the bust size(A ~ H)infomation -i BUST_LIST, --infomation BUST_LIST infomation -u UNDER, --under UNDER bust infor -t TOP, --top TOP bust infomation
-b
$python3 o.py -b A A :Angel
$python3 o.py -b H H :女性の敵
-u,-t
$python3 o.py -u 60 -t 77 AA60
-i
$python3 o.py -i H The difference between the top and the under is 25.0 cm
最後に
ブログの内容はくだらないがargparseは慣れると非常に使いやすいし今まで適当に逃げていた部分も改善できる非常に良いツールであると感じました。
参照
16.4. argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.5.2 ドキュメント