Python.use(better) #Vector: step00 -- class Vector(object):

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

class Vector(object):

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

課題を作成する過程を通して「数値演算」の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

事例:コードの解説

各ステップごとに進化するコードの断片を、順を追って段階的に解説します。

    class Vector(object):
        pass

    ## ----------------------------------------
    local = locals()
    ex_vector(local)
■ #1: 空文

新たに定義したクラスは、次のように、

    class Vector(object):
        pass

その本体が空 pass です。

《NOTE》何もしないことに意義がある:構文規則では、そこに少なくとも1つの文を記述すべき箇所があります。しかし、そこで何も実行したくないときには、空文として pass を利用すると便利です。クラスの本体に何も記述しないと、次のように、

    class Vector(object):

...
$ python -i vector.py
  File "vector.py", line 2
    
                      ^
IndentationError: expected an indented block
>>> 

例外 IndentationError を生成するとともに、エラーメッセージが出力されます。なぜなら、クラスブロックの本体に何か1つの文を記述すべきなのに、そこには何も記述していないからです。

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

付録に収録された「サンプルモジュール」を使って、学習を進める方法を紹介します。

■ 全項目を確認する

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

$ python -i vector.py
>>> do()
 0: step00 -- class Vector(object):
 1: step01 -- def __init__(self, *args):
 2: step02x -- def __add__(v1, v2):
 3: step03 -- return Vector(*s)
 4: step04 -- def __sub__(v1, v2):
 5: step05 -- def __neg__(self):
 6: step06 -- def __mul__(v1, v2):
 7: step07x -- sum(e1*e2 ...)
 8: step08x -- if hasattr(v2, "elements"):
 9: step09 -- def __rmul__(self, other):
10: step10 -- def __iter__(self):
11: step11x -- def __radd__(v1, v2):
12: step12x -- raise(TypeError(s))
13: step13 -- raise(TypeError(s))
14: step14 -- def _typeError(self, v1, v2, op):
>>>

これから、段階的に課題を完成させる様子(step00 から step14 まで)が分かります。各ステップの末尾に「x」とあるのは(たとえば step02x)未解決の問題を抱えていることを意味します。それ以外のステップでは「未完」であることを除いて、そこまでの動作を保証します。各ステップの動作を確認するには、各行の先頭にある「番号」を実引数に指定して、次のように利用します。

■ 各項目を実行する

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

  • 実引数に 0 を指定すると、0 番目の項目(step00)を実行します。
>>> do(0)
>>> # -------------------------------------------------- step00
>>> v = Vector(); v
<__main__.Vector object at 0x12cecd0>
>>>

クラス Vectorインスタンス v を生成します。すると、そのインスタンス(オブジェクト)に固有の情報が、次のような形式で出力されます。

《NOTE》何も問題がないことを確認する:最初に確認すべきことは、プログラミング環境が整っているかどうかです。ここでは、本体が空のクラスを利用して、他には「何も問題がないことを確認する」ことに意義があります。すると、これから安心してプログラミングに専念するための準備が整います。

ここで注目して欲しいのは、先頭行は対話モードによる入力ですが、次行からは関数 do を実行したときに得られる出力です。プロンプトを模した文字列「>>>」が出力されるのは(後述するように)意図的なものです。モジュール(ここでは vector.py)を起動するときに、オプション -i を指定してあるので、

>>> v = Vector(); v
()
    
引き続き対話モードで(プロンプト「>>>」の後に)コードを入力しても、同じ出力結果が得られます。ただし、その動作を確認できるのは、完成版(ここでは step14)だけです。

《余録》テストケース

各ステップの「動作」を確認するために、さまざまなテストケースを用意しました。そこでは、
    def ex_vector(local):                        #@:
        source = '''
v = Vector(); v
'''.split("\n")

        do_it(source, local)

## ----------------------------------------
def do_it(source, local):
    for e in source[1:-1]:
        try:
            print_(e, local)
        except AttributeError as error:
            print("AttributeError:", error)
        except TypeError as error:
            print("TypeError:", error)
この関数 do_it を再利用しています。 三重引用符「'''」に続く各行は、対話モードで入力されるコードの断片に相当します。すると(対話モードで実行したかのように)各行をひとつずつ評価した結果が出力されます。各項目を実行したときに(step00 の次行から)プロンプトに続いて入出力を繰り返したかのように、同じ結果が得られます。
《TIPS》テストケースもプログラミングの対象になる:テストケース自身もプログラミングの成果物です。このテストケースを起動すると、あたかも「対話モードで入出力を繰り返した」かのような、出力結果が得られます。実際に、この出力をファイルに保存するだけで、モジュール testmod を利用して、テストケースを自動的に実行できます。詳細は「基礎編」で解説します。
》こちらに移動中です《TOP

関連記事

Last updated♪2009/12/09