2013年10月8日火曜日

if文にかわるコード

 = if文に変わるコード
前回のコードは一部間違いがある
修正と クラス化 モジュール化
しておく。
E:\myprg_main\python_my_prg\ode_prg\mnu2.py

[2013-10-08 21:09]



# coding: UTF-8

#if 条件: com1
#elif:    com2
#    .
#    .
#    .
#形式の関数を何個も作成する場合、いちいちif文を何回も書くのが
#面倒なのでif文を辞書形式にして,簡単に作成できるようにする。
#要は、①実行コマンドを定義 ②判定コマンドを定義 ③辞書を定義
#④全ての判定コマンドを実行し(判定コマンド,結果)のタプルのリスト
#を作成(入れ子になった辞書の中の判定コマンドも含む) 
#⑤辞書のタプルと実行コマンドで共通するタプルのキー(実行コマンド)
#を実行 (入れ子になっている辞書の中の実行コマンドも含む)

#実行辞書
#辞書形式で実行
#辞書は dicの単語を含むもので定義する
#dic1:辞書名 input:条件を判定する関数 "a","b","c":各コマンドを実行する条件
#a~c_com:各判定ごとに実行するコマンド
#dic1 = {
#        (input,"a"):a_com,
#        (input,"b"):,dic2
#        (input,"c"):c_com
#        }

#判定リスト
#辞書のなかで定義された判定コマンドの実行結果を一律に管理する辞書
#つまり このコマンドの実行結果は/・ このコマンドの実行結果は..と対応
#する辞書



class Mnu:
    def __init__(self, dic):
        self.hantei_com_rt_ls = []
        self.dic = dic
        #self.ls = []


    #実行辞書から実行コマンドを重複することなく取り出し順次実行し
    #判定リストに書き込む
    def get_dickey(self):
        print "get_dickey(dic) "
        print "dic", self.dic
        #辞書を分かりやすく書き出す
        def cat_dic(dic):
            keylist = dic.keys()
            for k in keylist:
                print
                print k
                if not type(dic[k])==dic:
                    print dic[k]
                else:
                    print
                    #print "\t"
                    cat_dic(dic[k])
        cat_dic(self.dic)


        def get_dickey_sub(dic, ls):
            print
            #global ls
            #通常リストの場合 global宣言はいらなかったと思っていたが...
            #引数にした場合はglobal宣言はいらない
            #元の辞書のキーから判定コマンドを取得
            keylist = dic.keys()
            ls +=  [t[0] for t in keylist]
            print "ls", ls
       
            #サブの辞書の値から判定コマンドを取得
            #元の辞書の値のリストの要素からさらに辞書であるものだけを
            #リストにする
            #それに対してこの関数を再帰させる
            val_ls = [val for val in dic.values() if type(val)==dict]
            #print type(val)
            #組み込み関数 type
            #http://ngi644.net/blog/archives/182
            #http://jutememo.blogspot.jp/2008/09/python-types.html
            for val_dic in val_ls:
                get_dickey_sub(val_dic, ls)
   
   
        ls = []
        get_dickey_sub(self.dic, ls)
        #http://www.mapee.jp/python/post_14.html
        #例外として、関数に引数として、リストを渡された場合は、関数内で変更され
        #たリスト要素の値が、グローバルスコープでも有効となります。
        #重複する判定コマンドを削除する
        ls_set = list(set(ls))
        uniq_zikkou_com_ls = ls_set
        print
        print "uniq_zikkou_com_ls", uniq_zikkou_com_ls
        print
   
        print "判定コマンドを実行"
        for com in uniq_zikkou_com_ls:
            rt = com()
            self.hantei_com_rt_ls.append((com, rt))
            #print hantei_com_rt_ls
            #判定コマンドとその結果のリストを作成していく
            #判定リスト[(コマンド,実行結果), ....]
        print "get_dickey(dic) --- end"
   
   
    #判定リスト、実行辞書のキーリストはタプルのリスト形式となる
    def zikkou(self):
        print "zikkou(dic) "

        def zikkou_sub(dic):
            print
            print "zikkou(dic) "
            for k in dic.keys():
                for h in self.hantei_com_rt_ls:
                    if k==h:
                        #print "k",k
                        if not type(dic[k])==dict:
                            #辞書の値が関数ならそれを実行
                            dic[k]()
                        else:
                            #関数以外(辞書)なら再帰をかける
                            zikkou_sub(dic[k])
        zikkou_sub(self.dic)
       

if __name__ == "__main__":
    def a_com():
        print 'aのコマンド'
        #sys.exit()
    def b_com():
        print 'bのコマンド'
        #sys.exit()
    def c_com():
        print 'cのコマンド'
        #sys.exit()
    def t_com():
        print 'tのコマンド'
        #sys.exit()
   
    #判定コマンドの定義
    def input_1w():
        print "input_1w"
        print "キーを入力してください"
        rt = raw_input()
        return rt
   
    def input_1x():
        print "input_1x"
        print "キーを入力してください"
        rt = raw_input()
        return rt
   
    def input_3y():
        print "input_3y"
        print "キーを入力してください"
        rt = raw_input()
        return rt
   
    def input_3z():
        print "input_3z"
        print "キーを入力してください"
        rt = raw_input()
        return rt
   
    def flg_2():
        print "flg_2はtです"
        return "t"
   
    #実行の元となる実行辞書
    dic2 = {
            (flg_2,  "t"):t_com
            }
    dic3 = {
            (input_3z,"a"):dic2,
            (input_3y,"b"):b_com,
            (input_3y,"c"):c_com
            }
   
    dic1 = {
            (input_1w,"a"):dic2,
            (input_1w,"b"):dic3,
            (input_1x,"c"):c_com
            }
   
    #実行
    #dic1は大元辞書
    mnu = Mnu(dic1)
    mnu.get_dickey()
    mnu.zikkou()


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts