Python カスタム関数§10:テストプログラムを簡単に試せるメニュープログラム

Python便利なカスタム関数

今回は便利なカスタム関数というより、便利ツール(スクリプト)を提供したいと思います。

Pythonでテストプログラムを書くときどうしていますか?

Pythonのスクリプト(プログラム)を作るときにみなさんはどうしていますでしょうか?

いろいろとプログラム開発環境すなわちプログラムのコードを編集をする環境によって、工夫の仕方が変わってくると思いますが、以下の方法があるのではないでしょうか?

 

  1. Jupyter lab(Jupyter notebook)で試す
  2. Ipythonで試す
  3. 関数を作って、メインから呼び出す構造を使う

ちょっとわかりにくいので、実例を挙げてみましょう。print文、for文、リスト内包表記など簡単なものですが、構文を忘れた場合などは、ちょっと試してみたいときがありますよね

Jupyter Nootebookを使ったテスト例

Jupyter Nnotebookはその場で実行して、すぐに確認できるので便利ですよね。

 

Ipythonを使ったテスト例

IpythonもJupyterと同じく、簡単に試すことができると思います。

エディターで開発している場合

私は、日ごろサクラエディタを使って、pythonのプログラムを作っています。プログラムを開発するためのソフトは、いろいろあるのですが、真っ白な状態から作るのは、結構面倒です。

まず、サクラエディタを立ち上げます。

コードを打ち込みますが、その前に空っぽのまま、ファイルを保存しておきます。

なぜかというと拡張子が.pyになるとカラー表示になるからです。

そして、コードを書きこんでいきます。

そして、Ctrl+Bを押して、実行ですが・・・

上記のようにa=input()という文を入れておかないと一瞬でウインドウが消えてしまいます。

そして、キー入力待ち状態にすれば、

このようにやっと表示ができるという具合です。

どう考えても前者の2つ(Jupyter NnotebookやIpython)の方が簡単だし、楽だし

圧勝ですよね。

どうしてもエディタでプログラムを編集したい理由がある!

 

本当に1行2行の試しテストならば、エディタを使うのは、あほらしいほど面倒に見えるのですが、ある程度のかたまりのプログラムを作るときには、エディタは実は、最強の「開発環境」だと思っています。これには、賛否両論ありますので、あくまで私の意見ですので、そのあたりはご容赦を・・・

Tanudon
Tanudon

たぬどんもエディタが好きよ。特にサクラエディタ大好き

なぜかというと

(1)コードのあっちゃこっちゃに散らばった関数を探したり、

(2)さっき見ていたところと今編集しているところを比べてみたい

(3)簡単に他のファイルのコードのコピペができる

(4)GREP検索で、これまで作ってきたプログラムの中から一気にコードを見つけ出す

など、挙げたらきりがないほどの恩恵を受けるのです。

エディタで簡単にテストできるツールを作ろう!

 

ということで、今回紹介する「プロトタイピング雛形」です。

名付けて「プロトタイピング.py」

Tanudon
Tanudon

そのままやんか。ひねりなさいひねりなさい

プロトタイピング.pyは、メニュー形式でテストができる構造になっています。

今回のスクリプトには100個のテスト関数を登録することができるようになっています。

プログラムの登録方法

 

例えば、さきほどテストした3つのプログラムを登録してみます。

サクラエディタのいいところは、左に表示されているようなアウトラインも簡単に表示できるところですね。今回はtest01()~test(03)の3つ関数にに登録してみました。

 

 

メニュー項目の登録の仕方

ついでにメニューの項目も書いておきましょう(簡単なプログラムを試すときは、面倒なのでしませんが・・・)

 

 

プログラムの使い方

プログラムを実行してみましょう

 

最後の行に表示されているとおり、実行したい番号を入力すれば、その関数が実行されます。

1を入力してEnterを押してみますと、Hello Worldと表示されています。

何かキーを押せば、続けて、メニューを選択できますし、「Q」[q]を押せば、終了します。

それでは、メニューを1→3→2 と変則的に実行してみましょう

こんな感じで、メニューの順序も好きなように選べます。

好きなメニュー番号だけ表示させる方法

メニュー表示する番号を制限することもできます。100個もすべて表示することは少ないと思いますので、必要な番号だけを表示させるようにしています。次に例として、1番と3番だけメニューを表示する方法です。

prg_selectという関数の中にusingというリストがありますので、そのリストに番号を入れるだけです。

そうすると実行しても1と3だけしかメニューに出てきません。

 

特定の番号だけ実行するバッチファイル

いろいろテストが終わって、毎回、同じプログラムを実行することになったような場合、つまり、完成した場合は、その番号のプログラムを実行するバッチファイルを作っておくと便利です。

以下は例えば 「prg.bat」という名前で保存されたバッチファイルの中身です。

この場合は「3」番目のメニューのプログラムが実行されます。この番号をなしにするか、0にしておくとメニューから選べるバッチファイルになります。

プロトタイプ.pyのダウンロード

以下をクリックしてダウンロードしてください。zipで圧縮していますので、適当なフォルダーに保存して、解凍してください

メニュー5個用のコード

今回、ダウンロード用に用意したのが、100個のメニュー登録ができるものですが、参考までに5個用のプログラムコードを掲載します。5番目のプログラムを実行すれば、テキストファイルが出力されますので、そのコードを挿入していけば、メニューを増設できます(中級者用)

 

# -*- coding: utf-8 -*-
#2020.11.08 テストプログラムを簡単に作るための雛形です。100個までメニューにできます。

import sys
import os

####################################################################################################

#■■汎用関数

####################################################################################################
def hinagata_output():   # ■テストプログラムのひな形を出力する(スタート番号と終了番号を指定する)
    #プロトタイピングのコードを書きやすくするためにひな形をprintする。コピーして使う
    sno=101
    eno=200
    data=[]
    for i in(range(sno,eno+1)):
        s1='####################################################################################################'
        s2=f'def test{i:02}():'
        s3='    pass'
        data.append(s1)
        data.append(s2)
        data.append(s3)
    for i in (range(sno,eno+1)):
        s1=f'    ####################'
        s2=f'    if prg_no=={i:}:'
        s3=f'        # ■'
        s4=f"        print('test{i:02}')"
        s5=f'        test{i:02}()'   
        data.append(s1)
        data.append(s2)
        data.append(s3)
        data.append(s4)
        data.append(s5)
    for i in (range(sno,eno+1)):
        s1=f"    prg_title.append('{i:02} ')"
        data.append(s1)

    filename='tmp.txt'
    with open(filename, mode='w') as f:    #変換した結果をfile2に書き込む
        for r in data:
            print(r)
            f.write(r+'\n')
                
####################################################################################################
def test01():#  ■Hello World
    print('Hello World')
####################################################################################################
def test02():#  ■for文の確認
    for i in range(10):
        if i % 2==0 :
            print(i)
####################################################################################################
def test03():#  ■リスト内包表記の確認
    print([x for x in range(10) if x % 2==1])
    
####################################################################################################
def test04():
    pass
####################################################################################################
def test05():#■テストプログラムのひな形を出力する(スタート番号と終了番号を指定する)
    hinagata_output()   #テストプログラムのひな形出力サブルーチン
####################################################################################################
def prg_select(prg_no=0):
    #プログラム番号を選択し、実行する。メニューにタイトルを書き込むこともできます。
    prg_title=[]
    prg_title.append('00 ■Dummy')
    prg_title.append('01 ■Hello World')
    prg_title.append('02 ■for文の確認')
    prg_title.append('03 ■リスト内包表記の確認')
    prg_title.append('04 ')
    prg_title.append('05 ■雛形出力')

    print('========== テスト プログラム ==========')
    
    ### このusingにメニューで表示するプログラム番号を記述する ###
    using=[1,2,3,4,5]
    
    #############################################################
    
    for no,title in enumerate(prg_title):
        if (no) in using:
            print(title)
    print('===============================================')
        
    #文字列を数値(int型)に変換
    try:
        if prg_no==0:
            prg_no=int(input('Prgram No=?'))
    except:
        prg_no=0
        print('Error')
    ####################
    if prg_no==1:
        # ■
        print('test01')
        test01()
    ####################
    if prg_no==2:
        # ■
        print('test02')
        test02()
    ####################
    if prg_no==3:
        # ■
        print('test03')
        test03()
    ####################
    if prg_no==4:
        # ■
        print('test04')
        test04()
    ####################
    if prg_no==5:
        # ■
        print('test05')
        test05()
    ####################
####################################################################################################
#■メインプログラム
if __name__  == '__main__':
    
    #プログラム番号を入力して実行
    flag=True

    args = sys.argv #コマンドライン引数
    
    if len(args)==1 :
        auto_no=0   #プログラム選択
    else:
        auto_no=int(args[1])
        
    while flag:  
        #引数を設定すると直接プログラムが起動する
        #プログラムを選択するルーチンを呼び出す 番号を0にすると選択モード
        print("プログラムスタート")
        
        prg_select(auto_no)
        print("プログラム終了")
        
        a=input('終了するには [Q][q] and enterany key!')
        if a=='q'or a=='Q':
            print('プログラムを終了します。お疲れ様でした(^^)')
            break
        if auto_no!=0:
            break

####################################################################################################

 

ひとつ、おことわりごとがあります

この方法では、もちろんサクラエディタなど、テキストエディタでpythonのプログラムを作っている人には重宝しますが、MACでは動かないかもしれません。Windowsでしか確認できていません。

input文が動作できない環境ではどうやらだめみたいです。

それから、このコードは、JupyterやIpythonでも動作しないことを確認しています。idleでは動作しました。

いろいろ制約付きですみません。m(__)mペコペコ

また、GUIバージョンを考えますので、そのバージョンに期待してくださいね。

 

 

 

 

 

コメント

タイトルとURLをコピーしました