コマンドライン引数の処理

現在のコマンドライン引数処理部分は、以下のようになっています。

(ファイル名) loto.pyの一部

    if len(sys.argv) != 2:
        print("""引数の数が違います。
loto 種別(5,6,7) 抽選回(1〜)
""")
        sys.exit()

    div = int(sys.argv[1])
    if div < 5 or div > 7:
        print("宝くじ種別が違います。")
        print("""宝くじ種別:
5:ミニロト
6:ロト6
7:ロト7""")
        sys.exit()

このまま突き進むと、プログラムに機能が増えてきた時にえらいことになりそうなので、argparseを使う方法に変更します。
»argparseによるコマンドライン引数の解析

コマンドライン引数解析部分は、以下のようになります。

from argparse import ArgumentParser as ap
def main():
    parser = ap()
    loto_choices = ['miniloto', 'loto6', 'loto7']
    parser.add_argument("loto_div", help="宝くじ種別(miniloto,loto6,loto7)", choices=loto_choices)
    parser.add_argument("-f", "--function", help="機能: f)分布図の表示 n)予想抽選番号を当てる", choices=['f', 'n'],
            default='n')

    args = parser.parse_args()

プログラムの機能が増えた場合は、-functionオプション引数に選択項目を追加します。

これを踏まえて、loto.pyを書き替えると以下のようになります。

(ファイル名) loto.py

import sys
import numpy as np
import matplotlib.pyplot as plt
from argparse import ArgumentParser as ap
from all_loto import AllLoto
from miniloto_analysis import MinilotoAnalysis
from loto6_analysis import Loto6Analysis
from loto7_analysis import Loto7Analysis
# from algo.distribution import distribution

def main():
    parser = ap()
    loto_choices = ['miniloto', 'loto6', 'loto7']
    parser.add_argument("loto_div", help="宝くじ種別(miniloto,loto6,loto7)", choices=loto_choices)
    parser.add_argument("-f", "--function", help="機能: f)分布図の表示 n)予想抽選番号を当てる", choices=['f', 'n'],
            default='n')

    args = parser.parse_args()

    loto_div = loto_choices.index(args.loto_div)
    loto_class = [MinilotoAnalysis, Loto6Analysis, Loto7Analysis]

    all_loto = AllLoto()
    loto_data = [all_loto.miniloto, all_loto.loto6, all_loto.loto7]
        
    analysis = loto_class[loto_div](loto_data[loto_div])

    # 機能(--functionオプション)による場合分け
    if args.function == 'f':
        ratio = analysis.number_ratio()
        plt.bar(list(range(1, len(ratio)+1)), ratio)
        plt.show()
    elif args.function == 'n':
        print("抽選番号は〜です。")


if __name__ == '__main__':
    main()