《30》削除:メソッド __delitem__〈Python 3.0 版〉

前の記事記事一覧次の記事

実録:はじめてのプログラミング《Python3.0》
削除:メソッド __delitem__

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月24日(火)

■ 概要

デザインパターンを学習するための題材として、連結リストを作成します。

組み込み型 list と同等の機能を実現することで、その理解を深めます。list を利用できる状況ならいつでも、これから作成するクラス myList で代用できることを目指します。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

削除:メソッド __delitem__

組み込み型 list と同様に、del 文を利用して要素を削除できると便利です。

def ex___delitem__():
    for i in range(4):
        X = 's = myList("ABC"); s'
        print(">>>",X)
        eval(compile(X,"","single"))
        X = 'del s[{0}]; s'.format(i)
        print(">>>",X)
        eval(compile(X,"(x_x)","single"))

その動作(仕様)を確認すると、

>>> ex___delitem__()
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> del s[0]; s
['B', 'C']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> del s[1]; s
['A', 'C']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> del s[2]; s
['A', 'B']
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> del s[3]; s
Traceback (most recent call last):
  ...
    raise IndexError("{0} assignment index out of range".format(s))
IndexError: myList assignment index out of range

先頭からのオフセット値を指定して(その位置にある)要素を削除できるのが分かります。ただし、範囲を越えるオフセット値を指定すると、例外 IndexError を生成して、エラーメッセージを出力します。そこで、


実現:メソッド __delitem__

メソッド list.__delitem__ に準拠したものを実現します。

class myList(object):
    ...
    def __delitem__(self, key):
        prev, node = self.head, self.head.next
        n = 0
        while node:
            if n==key:
                prev.next = node.next
                del node
                break
            prev, node = node, node.next
            n += 1
        else:
            s = self.__class__.__name__
            raise IndexError("{0} assignment index out of range".format(s))

演算子 del に呼応して、各要素を削除する手段を提供します。局所変数 n が、指定した引数 key と同じ値になるとき、その直前のノードの後続 prev.next は、削除したいノードの後続 node.next と同じ値に再設定します。すると、削除したい直前のノードの後に、削除したい直後のノードが続くようになります。そして、指定したオフセット値にある、オブジェクト node を削除します。条件を満たす要素が見つからないときには、例外 IndexError を生成するとともに、エラーメッセージを出力します。

Tips

この場面では〈GoFIterator パターンの効用を活かせません。データ構造に依存する部分を一か所に記述して、他は抽象的な表現にするのが理想です。

Last updated♪09/06/19