《30》削除:メソッド __delitem__〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《30》削除:メソッド __delitem__

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

今日の進捗

  • Language Reference: Numeric and Mathematical Modules; functools — Higher order functions and operations on callable objects
  • Python.use(better) -- セミナー研修テキスト
  • 連結リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 普通の生活と同じで後始末(削除)はとても大切なことが分かりました。
担当:伊藤/本間 。(^^)

削除:メソッド __delitem__

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

def ex():
    for i in range(4):
        s = myList("ABC")
        print "-->",s,i,"\t#",s.__class__.__name__
        del s[i]
        print "<--",s,i,"\t#",s.__class__.__name__

>>> ex()
    • > ['A', 'B', 'C'] 0 # myList
<-- ['B', 'C'] 0 # myList
    • > ['A', 'B', 'C'] 1 # myList
<-- ['A', 'C'] 1 # myList
    • > ['A', 'B', 'C'] 2 # myList
<-- ['A', 'B'] 2 # myList
    • > ['A', 'B', 'C'] 3 # myList
Traceback (most recent call last): ... raise IndexError,"%s assignment index out of range"%s IndexError: myList assignment index out of range

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

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,"%s assignment index out of range"%s

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

Tips

この場面では〈GoFIterator パターンの効用が活かせません。データ構造に依存する部分は一か所に集中させて記述して、他は抽象的な表現にするのを理想とするのは、そのためです。《ひよ子》□

Last updated♪09/03/17