Python.use(better) #Tutor: step09 -- def eval_tips(self, view, target, item)

記事一覧 Python.use(better)《Python3.1》

def eval_tips(self, view, target, item)

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

基礎編で利用した学習ツールを作成する過程を通して「プログラミング」の理解を深めます。
※ Tcl/Tk で作成した例題を、Python3.1 で再構成しました。

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python -i tutorTk.py
>>> do()
...
9: step09 -- def eval_tips(self, view, target, item):
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do に実引数を指定します。

>>> do(9)
>>> # -------------------------------------------------- step09

リスト領域の右側には、スクロールバーが現れます。

  • リスト領域(左下部)では、任意の項目を選択できます。
  • このとき、最大長の項目を表示するのに必要な長さ(幅)が確保されます。


(1)任意の項目を選択(ダブルクリック)すると、

  • テキスト領域(上部)には、選択した項目に関連する情報が表示されます。
  • テキスト領域(右下部)には、選択した項目のテストケースを実行した結果が表示されます。


(2)項目 "__add__" を選択すると、テキスト領域(右下部)には、

  • テストケースが用意されていないので、"*** None ***" が表示されます。


(3)項目 "append" を選択すると、テキスト領域(右下部)には、

  • テストケースが用意されているので、実行した結果が表示されます。

事例:コードの解説

def step09():
    """def eval_tips(self, view, target, item):"""

    class Tutor(object):
        ...
        def do_test(self, view, target, item):
            view.delete(1.0, END)
            try:
                self.eval_tips(view, target, item)  #@:
            except NameError:
                s = "*** None ***"
                view.insert(END, "%s"%s)

        def eval_tips(self, view, target, item):
            temp_file = "zoo.txt"

            save = sys.stdout                       # with context

            sys.stdout = open(temp_file,"w+")
            spec = target.__name__
            eval("ex_%s(spec,None)"%item)

            sys.stdout = save                       # with context
            self.log(view, open(temp_file,"r"))

        def log(self, view, file):
            for e in file:
                view.insert(END, "%s"%e)
■ #1: try/except
        def do_test(self, view, target, item):
            view.delete(1.0, END)
            try:
                self.eval_tips(view, target, item)  #@:
            except NameError:
                s = "*** None ***"
                view.insert(END, "%s"%s)

選択した項目 item に相当するテストケースを実行 eval_tips して、

  • その結果をテキスト領域に表示します。

そのテストケースが見つからないと、

  • 例外 NameError を捕捉して、except ブロックを実行します。
■ #2: 標準出力 stdout
            save = sys.stdout                       # with context
            sys.stdout = open(temp_file,"w+")
            ...
            sys.stdout = save                       # with context

標準出力 stdout を切り替えるだけで、その出力結果をファイルに保存できます。

■ #3: 組み込み関数 open
            sys.stdout = open(temp_file,"w+")
            ...
            self.log(view, open(temp_file,"r"))

テストケースを実行した結果を、標準出力 stdout ではなく、ファイル temp_file に書き出します。
ファイル temp_file を読み込んで、その内容をテキスト領域 view に表示します。

■ #4: テストケース

テストケースを実行した結果は、テキスト領域で確認できます。

        def do_test(self, view, target, item):
            ...
                self.eval_tips(view, target, item)  #@:

        def eval_tips(self, view, target, item):
            ...
            self.log(view, open(temp_file,"r"))

        def log(self, view, file):
            ...

補助関数 do_test は、eval_tips を介して、log に帰結します。

        def do_test(self, view, target, item):
            view.delete(1.0, END)
            ...
                view.insert(END, "%s"%s)

        def log(self, view, file):
            ...
                view.insert(END, "%s"%e)

メソッド delete および insert を用いて、テキスト領域 view に実行した結果を出力します。このとき、do_test と log とで、同様の構造が出現していることに注目してください。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/14