CUPに関する事【Pythonのオプションパーサ】

※このブログにはどちらかというと不快になる要素が含まれているかもしれません。閲覧の際には十分にご注意下さい。

概要

「使いやすく引数も自由自在なコマンドラインツールを作ってみたいんや〜」
ということでpythonコマンドラインツールを作る時に必要な引数を認識するオプションパーサーを使ってちょっとしたツールを作ってみたいと思います。

オプションパーサー

pythonコマンドラインオプション解析するためには以下の2つがあります。

  1. sys.argv
    一番、手軽に使えて基本的かつ手軽なやり方ですが引数の順番が変わったりすると対応がめんどくさくなるためオプションパーサーとしての応用がさせにくいです。
  2. argparse
    sys.argvに比べてadd_argumentを用いて必須項目を設定したり、変数の保存先を指定したり、真偽値を保存したり、変数の型を指定したりと様々なことが出来ます。

今回はargparseを使ってコマンドラインツールを作って行きたいと思います。

CUP

  1. 持つ手のある茶碗(ちゃわん)。 「コーヒー―」
  2. 賞杯。 「優勝―」
  3. ブラジャーの乳に当てる部分。

今回は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 ドキュメント

Pythonistaなら知ってるオプションパーサ - Qiita

ブラ |サイズ表 |下着の基礎知識 | ワコール